def __init__(self, request, response): # pylint: disable=super-init-not-called # Set self.request, self.response and self.app. self.initialize(request, response) self.start_time = datetime.datetime.utcnow() # Initializes the return dict for the handlers. self.values = {} self.gae_id = current_user_services.get_current_gae_id() self.user_id = None self.username = None self.partially_logged_in = False if self.gae_id: user_settings = user_services.get_user_settings_by_gae_id( self.gae_id, strict=False) if user_settings is None: email = current_user_services.get_current_user_email() user_settings = user_services.create_new_user( self.gae_id, email) self.values['user_email'] = user_settings.email self.user_id = user_settings.user_id if (self.REDIRECT_UNFINISHED_SIGNUPS and not user_services.has_fully_registered( user_settings.user_id)): _clear_login_cookies(self.response.headers) self.partially_logged_in = True else: self.username = user_settings.username self.values['username'] = self.username # In order to avoid too many datastore writes, we do not bother # recording a log-in if the current time is sufficiently close # to the last log-in time. if (user_settings.last_logged_in is None or not utils.are_datetimes_close( datetime.datetime.utcnow(), user_settings.last_logged_in)): user_services.record_user_logged_in(self.user_id) self.role = (feconf.ROLE_ID_GUEST if self.user_id is None else user_settings.role) self.user = user_services.UserActionsInfo(self.user_id) self.is_super_admin = ( current_user_services.is_current_user_super_admin()) self.values['iframed'] = False self.values['is_moderator'] = user_services.is_at_least_moderator( self.user_id) self.values['is_admin'] = user_services.is_admin(self.user_id) self.values['is_topic_manager'] = (user_services.is_topic_manager( self.user_id)) self.values['is_super_admin'] = self.is_super_admin if self.request.get('payload'): self.payload = json.loads(self.request.get('payload')) else: self.payload = None
def _migrate_user_id(snapshot_model): """Fix the assignee_id in commit_cmds in snapshot metadata and commit log models. This is only run on models that have commit_cmds of length two. This is stuff that was missed in the user ID migration. Args: snapshot_model: BaseSnapshotMetadataModel. Snapshot metadata model to migrate. Returns: (str, str). Result info, first part is result message, second is additional info like IDs. """ # Only commit_cmds of length 2 are processed by this method. assert len(snapshot_model.commit_cmds) == 2 new_user_ids = [None, None] for i, commit_cmd in enumerate(snapshot_model.commit_cmds): assignee_id = commit_cmd['assignee_id'] if (commit_cmd['cmd'] == rights_domain.CMD_CHANGE_ROLE and not user_services.is_user_id_correct(assignee_id)): user_settings = user_services.get_user_settings_by_gae_id( assignee_id) if user_settings is None: return ('MIGRATION_FAILURE', (snapshot_model.id, assignee_id)) new_user_ids[i] = user_settings.user_id # This loop is used for setting the actual commit_cmds and is separate # because if the second commit results in MIGRATION_FAILURE we do not # want to set the first one either. We want to either set the correct # user IDs in both commits or we don't want to set it at all. for i in python_utils.RANGE(len(snapshot_model.commit_cmds)): if new_user_ids[i] is not None: snapshot_model.commit_cmds[i]['assignee_id'] = new_user_ids[i] commit_log_model = ( exp_models.ExplorationCommitLogEntryModel.get_by_id( 'rights-%s-%s' % (snapshot_model.get_unversioned_instance_id(), snapshot_model.get_version_string()))) if commit_log_model is None: snapshot_model.put(update_last_updated_time=False) return ('MIGRATION_SUCCESS_MISSING_COMMIT_LOG', snapshot_model.id) commit_log_model.commit_cmds = snapshot_model.commit_cmds def _put_both_models(): """Put both models into the datastore together.""" snapshot_model.put(update_last_updated_time=False) commit_log_model.put(update_last_updated_time=False) transaction_services.run_in_transaction(_put_both_models) return ('MIGRATION_SUCCESS', snapshot_model.id)
def is_feature_enabled(feature_name): """A short-form method for server-side usage. This method evaluates and returns the values of the feature flag, using context from the server only. Args: feature_name: str. The name of the feature flag that needs to be evaluated. Returns: bool. The value of the feature flag, True if it's enabled. """ user_settings = user_services.get_user_settings_by_gae_id( current_user_services.get_current_gae_id()) return _evaluate_feature_flag_value_for_server(feature_name, user_settings)
def test_pre_delete_user_without_activities(self): user_models.UserSubscriptionsModel(id=self.user_1_id, activity_ids=[], collection_ids=[]).put() user_settings = user_services.get_user_settings(self.user_1_id) self.assertFalse(user_settings.deleted) wipeout_service.pre_delete_user(self.user_1_id) user_settings = user_services.get_user_settings_by_gae_id( self.user_1_gae_id) self.assertTrue(user_settings.deleted) pending_deletion_model = ( user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id)) self.assertEqual(pending_deletion_model.exploration_ids, []) self.assertEqual(pending_deletion_model.collection_ids, [])
def __init__(self, request, response): # pylint: disable=super-init-not-called # Set self.request, self.response and self.app. self.initialize(request, response) self.start_time = datetime.datetime.utcnow() # Initializes the return dict for the handlers. self.values = {} if self.request.get('payload'): self.payload = json.loads(self.request.get('payload')) else: self.payload = None self.iframed = False self.is_super_admin = ( current_user_services.is_current_user_super_admin()) if feconf.ENABLE_MAINTENANCE_MODE and not self.is_super_admin: return self.gae_id = current_user_services.get_current_gae_id() self.user_id = None self.username = None self.partially_logged_in = False self.user_is_scheduled_for_deletion = False if self.gae_id: user_settings = user_services.get_user_settings_by_gae_id( self.gae_id, strict=False) if user_settings is None: # If the user settings are not yet created and the request leads # to signup page create a new user settings. Otherwise logout # the not-fully registered user. email = current_user_services.get_current_user_email() if 'signup?' in self.request.uri: user_settings = user_services.create_new_user( self.gae_id, email) else: logging.error( 'Cannot find user %s with email %s on page %s' % (self.gae_id, email, self.request.uri)) _clear_login_cookies(self.response.headers) return self.values['user_email'] = user_settings.email self.user_id = user_settings.user_id if user_settings.deleted: self.user_is_scheduled_for_deletion = user_settings.deleted elif (self.REDIRECT_UNFINISHED_SIGNUPS and not user_services.has_fully_registered_account( user_settings.user_id)): self.partially_logged_in = True else: self.username = user_settings.username self.values['username'] = self.username # In order to avoid too many datastore writes, we do not bother # recording a log-in if the current time is sufficiently close # to the last log-in time. if (user_settings.last_logged_in is None or not utils.are_datetimes_close( datetime.datetime.utcnow(), user_settings.last_logged_in)): user_services.record_user_logged_in(self.user_id) self.role = (feconf.ROLE_ID_GUEST if self.user_id is None else user_settings.role) self.user = user_services.UserActionsInfo(self.user_id) self.values['is_moderator'] = user_services.is_at_least_moderator( self.user_id) self.values['is_admin'] = user_services.is_admin(self.user_id) self.values['is_topic_manager'] = (user_services.is_topic_manager( self.user_id)) self.values['is_super_admin'] = self.is_super_admin