예제 #1
0
    def validate(self):
        """Validates various properties of the UserQuery.

        Raises:
            ValidationError. Expected ID to be a string.
            ValidationError. Expected params to be of type UserQueryParams.
            ValidationError. Expected objective to be a string.
            ValidationError. Expected submitter ID to be a valid user ID.
            ValidationError. Expected status to be a string.
            ValidationError. Invalid status.
            ValidationError. Expected user_ids to be a list.
            ValidationError. Expected each user ID in user_ids to be a string.
            ValidationError. Expected user ID in user_ids to be a valid user ID.
            ValidationError. Expected sent_email_model_id to be a string.
        """
        if not isinstance(self.id, python_utils.BASESTRING):
            raise utils.ValidationError(
                'Expected ID to be a string, received %s' % self.id)

        if not isinstance(self.params, tuple):
            raise utils.ValidationError(
                'Expected params to be of type tuple, received %s' %
                type(self.params))

        if not isinstance(self.submitter_id, python_utils.BASESTRING):
            raise utils.ValidationError(
                'Expected submitter ID to be a string, received %s' %
                self.submitter_id)
        if not utils.is_user_id_valid(self.submitter_id):
            raise utils.ValidationError(
                'Expected submitter ID to be a valid user ID, received %s' %
                self.submitter_id)

        if not isinstance(self.status, python_utils.BASESTRING):
            raise utils.ValidationError(
                'Expected status to be a string, received %s' % self.status)
        if self.status not in feconf.ALLOWED_USER_QUERY_STATUSES:
            raise utils.ValidationError('Invalid status: %s' % self.status)

        if not isinstance(self.user_ids, list):
            raise utils.ValidationError(
                'Expected user_ids to be a list, received %s' %
                type(self.user_ids))
        for user_id in self.user_ids:
            if not isinstance(user_id, python_utils.BASESTRING):
                raise utils.ValidationError(
                    'Expected each user ID in user_ids to be a string, '
                    'received %s' % user_id)

            if not utils.is_user_id_valid(user_id):
                raise utils.ValidationError(
                    'Expected user ID in user_ids to be a valid user ID, '
                    'received %s' % user_id)

        if self.sent_email_model_id and not isinstance(
                self.sent_email_model_id, python_utils.BASESTRING):
            raise utils.ValidationError(
                'Expected sent_email_model_id to be a string, received %s' %
                self.sent_email_model_id)
예제 #2
0
    def validate(self):
        """Checks whether user_id, gae_id, firebase_auth_id, and parent_user_id
        are valid.

        Raises:
            ValidationError. The user_id is not specified.
            ValidationError. The user_id is not a string.
            ValidationError. The user_id has the wrong format.
            ValidationError. The gae_id is not a string.
            ValidationError. The firebase_auth_id is not a string.
            ValidationError. The parent_user_id has the wrong format.
            ValidationError. The parent_user_id is set for a full user.
            ValidationError. The parent_user_id is not set for a profile user.
        """
        if not self.user_id:
            raise utils.ValidationError('No user_id specified')

        if not isinstance(self.user_id, python_utils.BASESTRING):
            raise utils.ValidationError(
                'user_id must be a string, but got %r' % self.user_id)

        if not utils.is_user_id_valid(self.user_id):
            raise utils.ValidationError(
                'user_id=%r has the wrong format' % self.user_id)

        if (self.gae_id is not None and
                not isinstance(self.gae_id, python_utils.BASESTRING)):
            raise utils.ValidationError(
                'gae_id must be a string, but got %r' % self.gae_id)

        if (self.firebase_auth_id is not None and
                not isinstance(self.firebase_auth_id, python_utils.BASESTRING)):
            raise utils.ValidationError(
                'firebase_auth_id must be a string, but got %r' %
                self.firebase_auth_id)

        if (self.parent_user_id is not None and
                not utils.is_user_id_valid(self.parent_user_id)):
            raise utils.ValidationError(
                'parent_user_id=%r has the wrong format' % self.parent_user_id)

        if self.is_full_user() and self.parent_user_id is not None:
            raise utils.ValidationError(
                'parent_user_id must not be set for a full user, but got '
                'gae_id=%r, firebase_auth_id=%r, parent_user_id=%r' % (
                    self.gae_id, self.firebase_auth_id, self.parent_user_id))

        if not self.is_full_user() and self.parent_user_id is None:
            raise utils.ValidationError(
                'parent_user_id must be set for a profile user, but got '
                'gae_id=%r, firebase_auth_id=%r, parent_user_id=%r' % (
                    self.gae_id, self.firebase_auth_id, self.parent_user_id))
예제 #3
0
 def test_is_user_id_valid(self):
     self.assertTrue(utils.is_user_id_valid(feconf.SYSTEM_COMMITTER_ID))
     self.assertTrue(utils.is_user_id_valid(feconf.MIGRATION_BOT_USER_ID))
     self.assertTrue(utils.is_user_id_valid(feconf.SUGGESTION_BOT_USER_ID))
     self.assertTrue(utils.is_user_id_valid('uid_%s' % ('a' * 32)))
     self.assertFalse(utils.is_user_id_valid('uid_%s%s' % ('a' * 31, 'A')))
     self.assertFalse(utils.is_user_id_valid('uid_%s' % ('a' * 31)))
     self.assertFalse(utils.is_user_id_valid('a' * 36))
예제 #4
0
 def _get_external_id_relationships(cls, item):
     field_name_to_external_model_references = [
         base_model_validators.ExternalModelFetcherDetails(
             'message_ids',
             feedback_models.GeneralFeedbackMessageModel,
             ['%s.%s' % (item.id, i) for i in python_utils.RANGE(
                 item.message_count)])
     ]
     if (
             item.original_author_id and
             utils.is_user_id_valid(item.original_author_id)
     ):
         field_name_to_external_model_references.append(
             base_model_validators.UserSettingsModelFetcherDetails(
                 'author_ids', [item.original_author_id],
                 may_contain_system_ids=False,
                 may_contain_pseudonymous_ids=True
             ))
     if item.has_suggestion:
         field_name_to_external_model_references.append(
             base_model_validators.ExternalModelFetcherDetails(
                 'suggestion_ids', suggestion_models.GeneralSuggestionModel,
                 [item.id]))
     if item.entity_type in prod_validators.TARGET_TYPE_TO_TARGET_MODEL:
         field_name_to_external_model_references.append(
             base_model_validators.ExternalModelFetcherDetails(
                 '%s_ids' % item.entity_type,
                 prod_validators.TARGET_TYPE_TO_TARGET_MODEL[
                     item.entity_type], [item.entity_id]))
     if (
             item.last_nonempty_message_author_id and
             utils.is_user_id_valid(
                 item.last_nonempty_message_author_id)
     ):
         field_name_to_external_model_references.append(
             base_model_validators.UserSettingsModelFetcherDetails(
                 'last_nonempty_message_author_ids',
                 [item.last_nonempty_message_author_id],
                 may_contain_system_ids=False,
                 may_contain_pseudonymous_ids=True
             ))
     return field_name_to_external_model_references
예제 #5
0
 def test_is_user_id_valid(self):
     self.assertTrue(
         utils.is_user_id_valid(feconf.SYSTEM_COMMITTER_ID,
                                allow_system_user_id=True))
     self.assertTrue(
         utils.is_user_id_valid(feconf.MIGRATION_BOT_USER_ID,
                                allow_system_user_id=True))
     self.assertTrue(
         utils.is_user_id_valid(feconf.SUGGESTION_BOT_USER_ID,
                                allow_system_user_id=True))
     self.assertTrue(
         utils.is_user_id_valid('pid_%s' % ('a' * 32),
                                allow_pseudonymous_id=True))
     self.assertTrue(utils.is_user_id_valid('uid_%s' % ('a' * 32)))
     self.assertFalse(utils.is_user_id_valid('pid_%s' % ('a' * 32)))
     self.assertFalse(utils.is_user_id_valid('uid_%s%s' % ('a' * 31, 'A')))
     self.assertFalse(utils.is_user_id_valid('uid_%s' % ('a' * 31)))
     self.assertFalse(utils.is_user_id_valid('a' * 36))
    def __init__(
            self, field_name, model_ids,
            may_contain_system_ids, may_contain_pseudonymous_ids):
        """Initializes the UserSettingsModelFetcherDetails domain object.

        Args:
            field_name: str. A specific name used as an identifier by the
                storage model which is used to identify the user settings model
                reference. For example: `'committer_id': UserSettingsModel`
                means that committer_id is a field which contains a user_id
                used to identify the external model UserSettingsModel.
            model_ids: list(str). The list of user settings model IDs for which
                to fetch the UserSettingsModels.
            may_contain_system_ids: bool. Whether the model IDs contain
                system IDs which should be omitted before attempting to fetch
                the corresponding models. Set may_contain_system_ids to True if
                and only if this field can contain admin or bot IDs.
            may_contain_pseudonymous_ids: bool. Whether the model ids contain
                pseudonymous IDs which should be omitted before attempting to
                fetch the corresponding models. Set may_contain_pseudonymous_ids
                to True if and only if this field can contain user IDs that
                are pseudonymized as part of Wipeout. In other words, these
                fields can only be in models that have LOCALLY_PSEUDONYMIZE as
                their DELETION_POLICY.
        """
        model_id_errors = []
        validated_model_ids = []
        for model_id in model_ids:
            if model_id in feconf.SYSTEM_USERS.values():
                if not may_contain_system_ids:
                    model_id_errors.append(
                        'The field \'%s\' should not contain '
                        'system IDs' % field_name)
            elif utils.is_pseudonymous_id(model_id):
                if not may_contain_pseudonymous_ids:
                    model_id_errors.append(
                        'The field \'%s\' should not contain '
                        'pseudonymous IDs' % field_name)
            elif not utils.is_user_id_valid(
                    model_id,
                    allow_system_user_id=False,
                    allow_pseudonymous_id=False
            ):
                model_id_errors.append(
                    'The user id %s in the field \'%s\' is '
                    'invalid' % (model_id, field_name))
            else:
                validated_model_ids.append(model_id)
        self.field_name = field_name
        self.model_class = user_models.UserSettingsModel
        self.model_ids = validated_model_ids
        self.model_id_errors = model_id_errors
예제 #7
0
 def _get_external_id_relationships(cls, item):
     field_name_to_external_model_references = [
         base_model_validators.ExternalModelFetcherDetails(
             'feedback_thread_ids',
             feedback_models.GeneralFeedbackThreadModel,
             [item.thread_id]
         )
     ]
     if (
             item.author_id and
             utils.is_user_id_valid(item.author_id)
     ):
         field_name_to_external_model_references.append(
             base_model_validators.UserSettingsModelFetcherDetails(
                 'author_ids', [item.author_id],
                 may_contain_system_ids=False,
                 may_contain_pseudonymous_ids=True
             )
         )
     return field_name_to_external_model_references
예제 #8
0
    def validate(self):
        """Checks that the user_id, email, roles, banned, pin and display_alias
        fields of this UserSettings domain object are valid.

        Raises:
            ValidationError. The user_id is not str.
            ValidationError. The email is not str.
            ValidationError. The email is invalid.
            ValidationError. The roles is not a list.
            ValidationError. Given role does not exist.
            ValidationError. The pin is not str.
            ValidationError. The display alias is not str.
        """
        if not isinstance(self.user_id, python_utils.BASESTRING):
            raise utils.ValidationError(
                'Expected user_id to be a string, received %s' % self.user_id)
        if not self.user_id:
            raise utils.ValidationError('No user id specified.')
        if not utils.is_user_id_valid(self.user_id,
                                      allow_system_user_id=True,
                                      allow_pseudonymous_id=True):
            raise utils.ValidationError('The user ID is in a wrong format.')

        if not isinstance(self.banned, bool):
            raise utils.ValidationError(
                'Expected banned to be a bool, received %s' % self.banned)

        if not isinstance(self.roles, list):
            raise utils.ValidationError(
                'Expected roles to be a list, received %s' % self.roles)

        if self.banned:
            if self.roles:
                raise utils.ValidationError(
                    'Expected roles for banned user to be empty, '
                    'recieved %s.' % self.roles)
        else:
            default_roles = []
            if len(self.roles) != len(set(self.roles)):
                raise utils.ValidationError(
                    'Roles contains duplicate values: %s' % self.roles)
            for role in self.roles:
                if not isinstance(role, python_utils.BASESTRING):
                    raise utils.ValidationError(
                        'Expected roles to be a string, received %s' % role)

                if role not in feconf.ALLOWED_USER_ROLES:
                    raise utils.ValidationError('Role %s does not exist.' %
                                                role)

                if role in feconf.ALLOWED_DEFAULT_USER_ROLES_ON_REGISTRATION:
                    default_roles.append(role)

            if len(default_roles) != 1:
                raise utils.ValidationError(
                    'Expected roles to contains one default role.')

        if self.pin is not None:
            if not isinstance(self.pin, python_utils.BASESTRING):
                raise utils.ValidationError(
                    'Expected PIN to be a string, received %s' % self.pin)
            elif (len(self.pin) != feconf.FULL_USER_PIN_LENGTH
                  and len(self.pin) != feconf.PROFILE_USER_PIN_LENGTH):
                raise utils.ValidationError(
                    'User PIN can only be of length %s or %s' %
                    (feconf.FULL_USER_PIN_LENGTH,
                     feconf.PROFILE_USER_PIN_LENGTH))
            else:
                for character in self.pin:
                    if character < '0' or character > '9':
                        raise utils.ValidationError(
                            'Only numeric characters are allowed in PIN.')

        if (self.display_alias is not None and
                not isinstance(self.display_alias, python_utils.BASESTRING)):
            raise utils.ValidationError(
                'Expected display_alias to be a string, received %s' %
                self.display_alias)

        if not isinstance(self.email, python_utils.BASESTRING):
            raise utils.ValidationError(
                'Expected email to be a string, received %s' % self.email)
        if not self.email:
            raise utils.ValidationError('No user email specified.')
        if ('@' not in self.email or self.email.startswith('@')
                or self.email.endswith('@')):
            raise utils.ValidationError('Invalid email address: %s' %
                                        self.email)

        if not isinstance(self.creator_dashboard_display_pref,
                          python_utils.BASESTRING):
            raise utils.ValidationError(
                'Expected dashboard display preference to be a string, '
                'received %s' % self.creator_dashboard_display_pref)
        if (self.creator_dashboard_display_pref not in list(
                constants.ALLOWED_CREATOR_DASHBOARD_DISPLAY_PREFS.values())):
            raise utils.ValidationError(
                '%s is not a valid value for the dashboard display '
                'preferences.' % (self.creator_dashboard_display_pref))