Skip to content

Commit

Permalink
Add feature flag for dashboard segments filter
Browse files Browse the repository at this point in the history
  • Loading branch information
acelaya committed Sep 23, 2024
1 parent b0d0a57 commit dbddd4e
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 8 deletions.
5 changes: 4 additions & 1 deletion lms/js_config_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,7 @@ class DashboardConfig(TypedDict):
routes: DashboardRoutes

auto_grading_sync_enabled: bool
"""Whether or nor the opotion to sync grades back to the LMS is enabled."""
"""Whether or nor the option to sync grades back to the LMS is enabled."""

assignment_segments_filter_enabled: bool
"""Whether the segments filter dropdown should be displayed in the assignment view or not"""
1 change: 1 addition & 0 deletions lms/models/application_instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class ApplicationSettings(JSONSettings):
JSONSetting("hypothesis", "lti_13_sourcedid_for_grading", asbool),
JSONSetting("hypothesis", "auto_grading_enabled", asbool),
JSONSetting("hypothesis", "auto_grading_sync_enabled", asbool),
JSONSetting("dashboard", "assignment_segments_filter_enabled", asbool),
)


Expand Down
4 changes: 4 additions & 0 deletions lms/resources/_js_config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,10 @@ def enable_dashboard_mode(self, token_lifetime_seconds: int) -> None:
and self._application_instance.settings.get(
"hypothesis", "auto_grading_sync_enabled", False
),
assignment_segments_filter_enabled=not self._lti_user
or self._application_instance.settings.get(
"dashboard", "assignment_segments_filter_enabled", False
),
),
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ type StudentsTableRow = {
*/
export default function AssignmentActivity() {
const { dashboard } = useConfig(['dashboard']);
const { routes } = dashboard;
const { routes, assignment_segments_filter_enabled } = dashboard;
const { assignmentId, organizationPublicId } = useParams<{
assignmentId: string;
organizationPublicId?: string;
Expand All @@ -51,9 +51,12 @@ export default function AssignmentActivity() {
const autoGradingEnabled = !!assignment.data?.auto_grading_config;
const segments = useMemo((): DashboardActivityFiltersProps['segments'] => {
const { data } = assignment;
// For now, we want to display the segments filter only for auto-grading
// assignments, but this will eventually change
if (!data || !autoGradingEnabled) {
if (
!data ||
// Display the segments filter only for auto-grading assignments, or
// assignments where the feature was explicitly enabled
(!assignment_segments_filter_enabled && !autoGradingEnabled)
) {
return undefined;
}

Expand All @@ -76,7 +79,13 @@ export default function AssignmentActivity() {
selectedIds: segmentIds,
onChange: segmentIds => updateFilters({ segmentIds }),
};
}, [assignment, autoGradingEnabled, segmentIds, updateFilters]);
}, [
assignment,
assignment_segments_filter_enabled,
autoGradingEnabled,
segmentIds,
updateFilters,
]);

const students = useAPIFetch<StudentsMetricsResponse>(
routes.students_metrics,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ describe('AssignmentActivity', () => {
assignment: '/api/assignments/:assignment_id',
students_metrics: '/api/students/metrics',
},
assignment_segments_filter_enabled: false,
},
};

Expand Down Expand Up @@ -487,6 +488,28 @@ describe('AssignmentActivity', () => {
});
});

context('when assignment_segments_filter_enabled is true', () => {
beforeEach(() => {
fakeConfig.dashboard.assignment_segments_filter_enabled = true;
});

[{ sections: [{}, {}] }, { groups: [{}, {}, {}] }].forEach(
assignmentExtra => {
it('shows segments filter dropdown', () => {
setUpFakeUseAPIFetch({
...activeAssignment,
...assignmentExtra,
});

const wrapper = createComponent();
const filters = wrapper.find('DashboardActivityFilters');

assert.isDefined(filters.prop('segments'));
});
},
);
});

it(
'should pass a11y checks',
checkAccessibility({
Expand Down
9 changes: 9 additions & 0 deletions lms/static/scripts/frontend_apps/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,15 @@ export type DashboardUser = {
export type DashboardConfig = {
routes: DashboardRoutes;
user: DashboardUser;

/** Whether syncing grades is enabled for auto-grading assignments or not */
auto_grading_sync_enabled: boolean;

/**
* Whether the segments filter should be displayed for non-auto-grading
* assignments or not.
*/
assignment_segments_filter_enabled: boolean;
};

/**
Expand Down
4 changes: 4 additions & 0 deletions lms/templates/admin/application_instance/show.html.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@
{{ settings_checkbox("Enable auto-grading", "hypothesis", "auto_grading_enabled", default=False) }}
{{ settings_checkbox("Enable auto-grading grade sync", "hypothesis", "auto_grading_sync_enabled", default=False) }}
</fieldset>
<fieldset class="box">
<legend class="label has-text-centered">Dashboard settings</legend>
{{ settings_checkbox("Enable segments filter in assignment view", "dashboard", "assignment_segments_filter_enabled", default=False) }}
</fieldset>
<fieldset class="box">
<legend class="label has-text-centered">Canvas settings</legend>
{{ macros.disabled_text_field("API domain", instance.custom_canvas_api_domain) }}
Expand Down
24 changes: 22 additions & 2 deletions tests/unit/lms/resources/_js_config/__init___test.py
Original file line number Diff line number Diff line change
Expand Up @@ -713,18 +713,27 @@ def LTIEvent(self, patch):


class TestEnableDashboardMode:
@pytest.mark.parametrize("auto_grading_sync_setting", [True, False])
@pytest.mark.parametrize(
"auto_grading_sync_setting,assignment_segments_filter_setting",
[(True, True), (False, True), (True, False), (False, False)],
)
def test_it(
self,
js_config,
lti_user,
bearer_token_schema,
auto_grading_sync_setting,
assignment_segments_filter_setting,
application_instance,
):
application_instance.settings.set(
"hypothesis", "auto_grading_sync_enabled", auto_grading_sync_setting
)
application_instance.settings.set(
"dashboard",
"assignment_segments_filter_enabled",
assignment_segments_filter_setting,
)
js_config.enable_dashboard_mode(token_lifetime_seconds=100)
config = js_config.asdict()

Expand All @@ -749,9 +758,18 @@ def test_it(
"assignment_grades_sync": "/api/dashboard/assignments/:assignment_id/grading/sync",
},
"auto_grading_sync_enabled": auto_grading_sync_setting,
"assignment_segments_filter_enabled": assignment_segments_filter_setting,
}

def test_user_when_staff(self, js_config, pyramid_request_staff_member, context):
def test_user_when_staff(
self, js_config, pyramid_request_staff_member, context, application_instance
):
application_instance.settings.set(
"dashboard",
"assignment_segments_filter_enabled",
False,
)

js_config = JSConfig(context, pyramid_request_staff_member)
js_config.enable_dashboard_mode(token_lifetime_seconds=100)
config = js_config.asdict()
Expand All @@ -762,6 +780,8 @@ def test_user_when_staff(self, js_config, pyramid_request_staff_member, context)
}
# Grade syncing always disabled for staff
assert not config["dashboard"]["auto_grading_sync_enabled"]
# Segments filter is always enabled for staff
assert config["dashboard"]["assignment_segments_filter_enabled"]

@pytest.fixture
def pyramid_request_staff_member(self, pyramid_config, pyramid_request):
Expand Down

0 comments on commit dbddd4e

Please sign in to comment.