def test_disable_inactive_users(clean_db): """Check that the disable_inactive_users method disables users appropriately""" # Create two users who should be disabled, and one who should not now = datetime.now() Users(email="1@", _accessed=now - timedelta(days=INACTIVE_USER_DAYS)).insert() Users(email="2@", _accessed=now - timedelta(days=INACTIVE_USER_DAYS + 5)).insert() Users(email="3@", _accessed=now - timedelta(days=INACTIVE_USER_DAYS - 1)).insert() # All users start off enabled for user in Users.list(): assert user.disabled == False disabled = Users.disable_inactive_users() disabled = [u for u in disabled] assert len(disabled) users = Users.list() assert len([u for u in users if u.disabled]) == len(disabled) assert [u for u in users if not u.disabled][0].email == "3@"
def refresh_download_permissions(*args): """ Extend the expiry date for GCS download permissions belonging to users who accessed the system in the last 2 (or so) days. If we don't do this, users whose accounts are still active might lose GCS download permission prematurely. """ active_today = lambda q: q.filter( # Provide a 3 day window to ensure we don't miss anyone # if, e.g., this function fails to run on a certain day. Users._accessed > datetime.today() - timedelta(days=3) ) with sqlalchemy_session() as session: active_users = Users.list( page_size=Users.count(session=session, filter_=active_today), session=session, filter_=active_today, ) for user in active_users: print(f"Refreshing IAM download permissions for {user.email}") Permissions.grant_iam_permissions(user, session=session)
def test_common_list(clean_db): """Test listing behavior, inherited from CommonColumns""" for i in range(105): name = f"user_{i}" Users(email=f"{name}@example.com", first_n=name).insert() # List with defaults user_list = Users.list() assert len(user_list) == PAGINATION_PAGE_SIZE # List with different pagination size short_list = Users.list(page_size=5) assert len(short_list) == 5 # List with sorting sorted_list = Users.list(sort_field="id") assert sorted_list[0].first_n == "user_104" first_page = Users.list(sort_field="id", sort_direction="asc") assert first_page[0].first_n == "user_0" sorted_list = Users.list(sort_field="first_n", sort_direction="asc") assert sorted_list[0].first_n == "user_0" # Get the second page second_page = Users.list(page_num=1, sort_field="id", sort_direction="asc") assert second_page[0].first_n == "user_25" assert second_page[-1].first_n == "user_49" # Get the last page last_page = Users.list(page_num=4, sort_field="id", sort_direction="asc") assert len(last_page) == 5 # Get a negative page negative_page = Users.list(page_num=-1, sort_field="id", sort_direction="asc") assert set(n.id for n in negative_page) == set(f.id for f in first_page) # Get a too-high page too_high_page = Users.list(page_num=100, sort_field="id", sort_direction="asc") assert len(too_high_page) == 0 # Add a filter def f(q): return q.filter(Users.first_n.like("%9%")) all_expected_values = set(f"user_{i}" for i in range(100) if "9" in str(i)) filtered_page = Users.list( filter_=f, page_num=0, sort_field="id", sort_direction="asc" ) assert all_expected_values == set(f.first_n for f in filtered_page) # Get a too-large page for i in range(106, 300): name = f"user_{i}" Users(email=f"{name}@example.com", first_n=name).insert() big_page = Users.list(page_size=1e10) assert len(big_page) == MAX_PAGINATION_PAGE_SIZE