diff --git a/tutoraspects/plugin.py b/tutoraspects/plugin.py index d3668f492..c435a1fb4 100644 --- a/tutoraspects/plugin.py +++ b/tutoraspects/plugin.py @@ -129,6 +129,12 @@ "uuid": "abae8a25-1ba4-4653-81bd-d3937a162a11", "allow_translations": True, }, + { + "name": "Course Comparison Dashboard", + "slug": "course-comparison", + "uuid": "c6c7062d-dd90-4292-b9cf-84f7b9f38e73", + "allow_translations": True, + }, ], ), # The following settings are used to configure the Superset dashboards @@ -140,6 +146,7 @@ "course-dashboard": "c0e64194-33d1-4d5a-8c10-4f51530c5ee9", "learner-groups": "8661d20c-cee6-4245-9fcc-610daea5fd24", "individual-learner": "abae8a25-1ba4-4653-81bd-d3937a162a11", + "course-comparison": "c6c7062d-dd90-4292-b9cf-84f7b9f38e73", }, ), # ClickHouse xAPI settings @@ -376,7 +383,7 @@ # For now we are pulling this from github, which should allow maximum # flexibility for forking, running branches, specific versions, etc. ("DBT_REPOSITORY", "https://github.com/openedx/aspects-dbt"), - ("DBT_BRANCH", "v3.31.0"), + ("DBT_BRANCH", "v3.33.0"), ("DBT_SSH_KEY", ""), ("DBT_STATE_DIR", "/app/aspects-dbt/state"), ("DBT_PROFILES_DIR", "/app/aspects/dbt/"), diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_a433e3.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_a433e3.yaml new file mode 100644 index 000000000..aa934e024 --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_a433e3.yaml @@ -0,0 +1,133 @@ +_file_name: Course_Info_a433e3.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: 27a4476b-5a9a-4fc4-ac75-da520b522341 +description: null +params: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: emission_time + all_columns: [] + annotation_layers: [] + color_pn: false + column_config: + active_count: + columnWidth: 200 + course_name: + columnWidth: 300 + enrollees: + columnWidth: 150 + org: + columnWidth: 200 + tag_list: + truncateLongCells: true + conditional_formatting: [] + extra_form_data: {} + groupby: + - course_name + - org + metrics: + - enrollees + - active_count + - tag_list + order_by_cols: [] + order_desc: false + percent_metrics: [] + query_mode: aggregate + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + table_timestamp_format: smart_date + temporal_columns_lookup: {} + time_grain_sqla: P1M + viz_type: table +query_context: + datasource: + id: 645 + type: table + force: false + form_data: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: emission_time + all_columns: [] + color_pn: false + column_config: + active_count: + columnWidth: 200 + course_name: + columnWidth: 300 + enrollees: + columnWidth: 150 + org: + columnWidth: 200 + tag_list: + truncateLongCells: true + conditional_formatting: [] + dashboards: + - 161 + datasource: 645__table + extra_form_data: {} + force: false + groupby: + - course_name + - org + metrics: + - enrollees + - active_count + - tag_list + order_by_cols: [] + order_desc: false + percent_metrics: [] + query_mode: aggregate + result_format: json + result_type: full + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + slice_id: 1273 + table_timestamp_format: smart_date + temporal_columns_lookup: {} + time_grain_sqla: P1M + viz_type: table + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - course_name + - org + custom_form_data: {} + custom_params: {} + extras: + having: '' + time_grain_sqla: P1M + where: '' + filters: + - col: emission_time + op: TEMPORAL_RANGE + val: No filter + metrics: + - enrollees + - active_count + - tag_list + order_desc: false + orderby: + - - enrollees + - false + post_processing: [] + row_limit: 50000 + series_limit: 0 + url_params: {} + result_format: json + result_type: full +slice_name: Course Info +uuid: a433e3cc-8ed5-454a-8b17-5dd75cfc84e4 +version: 1.0.0 +viz_type: table diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_e0098c.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_e0098c.yaml new file mode 100644 index 000000000..19d329f2a --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_e0098c.yaml @@ -0,0 +1,133 @@ +_file_name: Course_Info_e0098c.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: 27a4476b-5a9a-4fc4-ac75-da520b522341 +description: null +params: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: emission_time + all_columns: [] + annotation_layers: [] + color_pn: false + column_config: + Current Enrollees: + columnWidth: 150 + active_count: + columnWidth: 200 + course_name: + columnWidth: 200 + course_run: + columnWidth: 300 + tag_list: + truncateLongCells: true + conditional_formatting: [] + extra_form_data: {} + groupby: + - course_run + - course_name + metrics: + - active_count + - tag_list + - enrollees + order_by_cols: [] + order_desc: false + percent_metrics: [] + query_mode: aggregate + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + table_timestamp_format: smart_date + temporal_columns_lookup: {} + time_grain_sqla: P1M + viz_type: table +query_context: + datasource: + id: 645 + type: table + force: false + form_data: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: emission_time + all_columns: [] + color_pn: false + column_config: + Current Enrollees: + columnWidth: 150 + active_count: + columnWidth: 200 + course_name: + columnWidth: 200 + course_run: + columnWidth: 300 + tag_list: + truncateLongCells: true + conditional_formatting: [] + dashboards: + - 161 + datasource: 645__table + extra_form_data: {} + force: false + groupby: + - course_run + - course_name + metrics: + - active_count + - tag_list + - enrollees + order_by_cols: [] + order_desc: false + percent_metrics: [] + query_mode: aggregate + result_format: json + result_type: full + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + slice_id: 1274 + table_timestamp_format: smart_date + temporal_columns_lookup: {} + time_grain_sqla: P1M + viz_type: table + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - course_run + - course_name + custom_form_data: {} + custom_params: {} + extras: + having: '' + time_grain_sqla: P1M + where: '' + filters: + - col: emission_time + op: TEMPORAL_RANGE + val: No filter + metrics: + - active_count + - tag_list + - enrollees + order_desc: false + orderby: + - - active_count + - false + post_processing: [] + row_limit: 50000 + series_limit: 0 + url_params: {} + result_format: json + result_type: full +slice_name: Course Info +uuid: e0098cfe-a312-4c49-8efd-7e74256b6ea4 +version: 1.0.0 +viz_type: table diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_2f2af8.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_2f2af8.yaml new file mode 100644 index 000000000..115e7abdf --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_2f2af8.yaml @@ -0,0 +1,104 @@ +_file_name: Enrollment_Counts_2f2af8.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: 27a4476b-5a9a-4fc4-ac75-da520b522341 +description: null +params: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: emission_time + aggregateFunction: Sum + annotation_layers: [] + colOrder: key_a_to_z + colSubTotals: false + conditional_formatting: [] + date_format: smart_date + extra_form_data: {} + groupbyColumns: + - enrollment_mode + groupbyRows: + - course_name + metrics: + - enrollees + metricsLayout: COLUMNS + order_desc: true + rowOrder: key_a_to_z + row_limit: 10000 + temporal_columns_lookup: {} + time_grain_sqla: P1D + valueFormat: SMART_NUMBER + viz_type: pivot_table_v2 +query_context: + datasource: + id: 645 + type: table + force: false + form_data: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: emission_time + aggregateFunction: Sum + colOrder: key_a_to_z + colSubTotals: false + conditional_formatting: [] + dashboards: + - 161 + datasource: 645__table + date_format: smart_date + extra_form_data: {} + force: false + groupbyColumns: + - enrollment_mode + groupbyRows: + - course_name + metrics: + - enrollees + metricsLayout: COLUMNS + order_desc: true + result_format: json + result_type: full + rowOrder: key_a_to_z + row_limit: 10000 + slice_id: 1294 + temporal_columns_lookup: {} + time_grain_sqla: P1D + valueFormat: SMART_NUMBER + viz_type: pivot_table_v2 + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - enrollment_mode + - course_name + custom_form_data: {} + custom_params: {} + extras: + having: '' + time_grain_sqla: P1D + where: '' + filters: + - col: emission_time + op: TEMPORAL_RANGE + val: No filter + metrics: + - enrollees + order_desc: true + orderby: + - - enrollees + - false + row_limit: 10000 + series_limit: 0 + url_params: {} + result_format: json + result_type: full +slice_name: Enrollment Counts +uuid: 2f2af8b0-94ae-4300-b71f-3bd7f9fc127c +version: 1.0.0 +viz_type: pivot_table_v2 diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_bd37be.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_bd37be.yaml new file mode 100644 index 000000000..093153981 --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_bd37be.yaml @@ -0,0 +1,104 @@ +_file_name: Enrollment_Counts_bd37be.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: 27a4476b-5a9a-4fc4-ac75-da520b522341 +description: null +params: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: emission_time + aggregateFunction: Sum + annotation_layers: [] + colOrder: key_a_to_z + colSubTotals: false + conditional_formatting: [] + date_format: smart_date + extra_form_data: {} + groupbyColumns: + - enrollment_mode + groupbyRows: + - course_run + metrics: + - enrollees + metricsLayout: COLUMNS + order_desc: false + rowOrder: key_a_to_z + row_limit: 50000 + temporal_columns_lookup: {} + time_grain_sqla: P1D + valueFormat: SMART_NUMBER + viz_type: pivot_table_v2 +query_context: + datasource: + id: 645 + type: table + force: false + form_data: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: emission_time + aggregateFunction: Sum + colOrder: key_a_to_z + colSubTotals: false + conditional_formatting: [] + dashboards: + - 161 + datasource: 645__table + date_format: smart_date + extra_form_data: {} + force: false + groupbyColumns: + - enrollment_mode + groupbyRows: + - course_run + metrics: + - enrollees + metricsLayout: COLUMNS + order_desc: false + result_format: json + result_type: full + rowOrder: key_a_to_z + row_limit: 50000 + slice_id: 1295 + temporal_columns_lookup: {} + time_grain_sqla: P1D + valueFormat: SMART_NUMBER + viz_type: pivot_table_v2 + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - enrollment_mode + - course_run + custom_form_data: {} + custom_params: {} + extras: + having: '' + time_grain_sqla: P1D + where: '' + filters: + - col: emission_time + op: TEMPORAL_RANGE + val: No filter + metrics: + - enrollees + order_desc: false + orderby: + - - enrollees + - true + row_limit: 50000 + series_limit: 0 + url_params: {} + result_format: json + result_type: full +slice_name: Enrollment Counts +uuid: bd37be7f-6672-4dca-80ae-a54f69d169da +version: 1.0.0 +viz_type: pivot_table_v2 diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_4e48b8.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_4e48b8.yaml new file mode 100644 index 000000000..3516c157f --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_4e48b8.yaml @@ -0,0 +1,123 @@ +_file_name: Learner_Performance_4e48b8.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: ffc33796-bcd4-4e8b-a4e4-ab6517b72116 +description: |- +
+
Avg % Correct on 1st Attempt
+
The average percentage of correct answers on the first attempt
+
+params: + adhoc_filters: [] + all_columns: + - success + annotation_layers: [] + color_pn: true + column_config: + avg_course_grade: + d3NumberFormat: ',.1%' + first_try_correct: + d3NumberFormat: ',.1%' + showCellBars: false + med_course_grade: + d3NumberFormat: ',.1%' + conditional_formatting: [] + extra_form_data: {} + groupby: + - course_name + - org + metrics: + - first_try_correct + - count_passing + - avg_course_grade + - med_course_grade + order_by_cols: [] + order_desc: true + percent_metrics: [] + query_mode: aggregate + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + table_timestamp_format: smart_date + temporal_columns_lookup: {} + time_grain_sqla: P1M + viz_type: table +query_context: + datasource: + id: 648 + type: table + force: false + form_data: + adhoc_filters: [] + all_columns: + - success + color_pn: true + column_config: + avg_course_grade: + d3NumberFormat: ',.1%' + first_try_correct: + d3NumberFormat: ',.1%' + showCellBars: false + med_course_grade: + d3NumberFormat: ',.1%' + conditional_formatting: [] + dashboards: + - 161 + datasource: 648__table + extra_form_data: {} + force: false + groupby: + - course_name + - org + metrics: + - first_try_correct + - count_passing + - avg_course_grade + - med_course_grade + order_by_cols: [] + order_desc: true + percent_metrics: [] + query_mode: aggregate + result_format: json + result_type: full + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + slice_id: 1279 + table_timestamp_format: smart_date + temporal_columns_lookup: {} + time_grain_sqla: P1M + viz_type: table + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - course_name + - org + custom_form_data: {} + custom_params: {} + extras: + having: '' + time_grain_sqla: P1M + where: '' + filters: [] + metrics: + - first_try_correct + - count_passing + - avg_course_grade + - med_course_grade + order_desc: true + orderby: + - - first_try_correct + - false + post_processing: [] + row_limit: 50000 + series_limit: 0 + url_params: {} + result_format: json + result_type: full +slice_name: Learner Performance +uuid: 4e48b8f9-e757-4263-a9d7-d18018620a24 +version: 1.0.0 +viz_type: table diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_4250c9.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_4250c9.yaml new file mode 100644 index 000000000..a210e3399 --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_4250c9.yaml @@ -0,0 +1,192 @@ +_file_name: Learner_Performance_Breakdown_4250c9.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: 1970f934-cffb-4c5a-8a13-69dab22755c7 +description: |- + Displays the top 10 highest enrollment courses. + Selecting different courses in the filter will display those courses. +params: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: enrolled_at + annotation_layers: [] + color_scheme: supersetColors + comparison_type: values + contributionMode: null + extra_form_data: {} + forecastInterval: 0.8 + forecastPeriods: 10 + groupby: [] + legendMargin: null + legendOrientation: bottom + legendType: scroll + logAxis: false + metrics: + - count + - passed + - active + - at_risk + minorSplitLine: false + minorTicks: false + only_total: true + order_desc: true + orientation: horizontal + rich_tooltip: false + row_limit: 10 + show_empty_columns: false + show_legend: true + show_value: false + sort_series_ascending: true + sort_series_type: name + stack: null + tooltipSortByMetric: false + tooltipTimeFormat: smart_date + truncateXAxis: false + truncateYAxis: false + truncate_metric: false + viz_type: echarts_timeseries_bar + xAxisLabelRotation: 0 + x_axis: course_name + x_axis_sort_asc: true + x_axis_sort_series: sum + x_axis_sort_series_ascending: false + x_axis_time_format: smart_date + x_axis_title: '' + x_axis_title_margin: 15 + y_axis_bounds: + - null + - null + y_axis_format: SMART_NUMBER + y_axis_title: '' + y_axis_title_margin: 15 + y_axis_title_position: Left + zoomable: false +query_context: + datasource: + id: 646 + type: table + force: false + form_data: + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: enrolled_at + annotation_layers: [] + color_scheme: supersetColors + comparison_type: values + contributionMode: null + dashboards: + - 161 + datasource: 646__table + extra_form_data: {} + force: false + forecastInterval: 0.8 + forecastPeriods: 10 + groupby: [] + legendMargin: null + legendOrientation: bottom + legendType: scroll + logAxis: false + metrics: + - count + - passed + - active + - at_risk + minorSplitLine: false + minorTicks: false + only_total: true + order_desc: true + orientation: horizontal + result_format: json + result_type: full + rich_tooltip: false + row_limit: 10 + show_empty_columns: false + show_legend: true + show_value: false + slice_id: 1275 + sort_series_ascending: true + sort_series_type: name + stack: null + tooltipSortByMetric: false + tooltipTimeFormat: smart_date + truncateXAxis: false + truncateYAxis: false + truncate_metric: false + viz_type: echarts_timeseries_bar + xAxisLabelRotation: 0 + x_axis: course_name + x_axis_sort_asc: true + x_axis_sort_series: sum + x_axis_sort_series_ascending: false + x_axis_time_format: smart_date + x_axis_title: '' + x_axis_title_margin: 15 + y_axis_bounds: + - null + - null + y_axis_format: SMART_NUMBER + y_axis_title: '' + y_axis_title_margin: 15 + y_axis_title_position: Left + zoomable: false + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - columnType: BASE_AXIS + expressionType: SQL + label: course_name + sqlExpression: course_name + custom_form_data: {} + custom_params: {} + extras: + having: '' + where: '' + filters: + - col: enrolled_at + op: TEMPORAL_RANGE + val: No filter + metrics: + - count + - passed + - active + - at_risk + order_desc: true + orderby: + - - count + - false + post_processing: + - operation: pivot + options: + aggregates: + active: + operator: mean + at_risk: + operator: mean + count: + operator: mean + passed: + operator: mean + columns: [] + drop_missing_columns: true + index: + - course_name + - operation: flatten + row_limit: 10 + series_columns: [] + series_limit: 0 + time_offsets: [] + url_params: {} + result_format: json + result_type: full +slice_name: Learner Performance Breakdown +uuid: 4250c976-a9b7-43ff-b5ad-8dd00a5acef7 +version: 1.0.0 +viz_type: echarts_timeseries_bar diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_9c3f72.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_9c3f72.yaml new file mode 100644 index 000000000..53b346008 --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_9c3f72.yaml @@ -0,0 +1,203 @@ +_file_name: Learner_Performance_Breakdown_9c3f72.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: 1970f934-cffb-4c5a-8a13-69dab22755c7 +description: Displays the top 10 highest enrollment courses. Selecting different courses + in the filter will display those courses. +params: + adhoc_filters: + - clause: WHERE + comparator: No filter + datasourceWarning: false + expressionType: SIMPLE + filterOptionName: filter_noj2mkjbumn_edkgbebkld8 + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: null + subject: enrolled_at + annotation_layers: [] + color_scheme: supersetColors + comparison_type: values + contributionMode: null + extra_form_data: {} + forecastInterval: 0.8 + forecastPeriods: 10 + groupby: [] + legendMargin: 0 + legendOrientation: bottom + legendType: scroll + logAxis: false + metrics: + - passed + - count + - at_risk + - active + minorSplitLine: false + minorTicks: false + only_total: true + order_desc: true + orientation: horizontal + rich_tooltip: false + row_limit: 10 + show_empty_columns: false + show_legend: true + show_value: false + sort_series_ascending: true + sort_series_type: name + stack: null + timeseries_limit_metric: null + tooltipSortByMetric: false + tooltipTimeFormat: smart_date + truncateXAxis: false + truncateYAxis: false + truncate_metric: true + viz_type: echarts_timeseries_bar + xAxisLabelRotation: 0 + x_axis: course_run + x_axis_sort_asc: true + x_axis_sort_series: name + x_axis_sort_series_ascending: true + x_axis_time_format: smart_date + x_axis_title: '' + x_axis_title_margin: 15 + y_axis_bounds: + - null + - null + y_axis_format: SMART_NUMBER + y_axis_title: '' + y_axis_title_margin: 15 + y_axis_title_position: Left + zoomable: false +query_context: + datasource: + id: 646 + type: table + force: false + form_data: + adhoc_filters: + - clause: WHERE + comparator: No filter + datasourceWarning: false + expressionType: SIMPLE + filterOptionName: filter_noj2mkjbumn_edkgbebkld8 + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: null + subject: enrolled_at + annotation_layers: [] + color_scheme: supersetColors + comparison_type: values + contributionMode: null + dashboards: + - 161 + datasource: 646__table + extra_form_data: {} + force: false + forecastInterval: 0.8 + forecastPeriods: 10 + groupby: [] + legendMargin: 0 + legendOrientation: bottom + legendType: scroll + logAxis: false + metrics: + - passed + - count + - at_risk + - active + minorSplitLine: false + minorTicks: false + only_total: true + order_desc: true + orientation: horizontal + result_format: json + result_type: full + rich_tooltip: false + row_limit: 10 + show_empty_columns: false + show_legend: true + show_value: false + slice_id: 1276 + sort_series_ascending: true + sort_series_type: name + stack: null + timeseries_limit_metric: null + tooltipSortByMetric: false + tooltipTimeFormat: smart_date + truncateXAxis: false + truncateYAxis: false + truncate_metric: true + viz_type: echarts_timeseries_bar + xAxisLabelRotation: 0 + x_axis: course_run + x_axis_sort_asc: true + x_axis_sort_series: name + x_axis_sort_series_ascending: true + x_axis_time_format: smart_date + x_axis_title: '' + x_axis_title_margin: 15 + y_axis_bounds: + - null + - null + y_axis_format: SMART_NUMBER + y_axis_title: '' + y_axis_title_margin: 15 + y_axis_title_position: Left + zoomable: false + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - columnType: BASE_AXIS + expressionType: SQL + label: course_run + sqlExpression: course_run + custom_form_data: {} + custom_params: {} + extras: + having: '' + where: '' + filters: + - col: enrolled_at + op: TEMPORAL_RANGE + val: No filter + metrics: + - passed + - count + - at_risk + - active + order_desc: true + orderby: + - - passed + - false + post_processing: + - operation: pivot + options: + aggregates: + active: + operator: mean + at_risk: + operator: mean + count: + operator: mean + passed: + operator: mean + columns: [] + drop_missing_columns: true + index: + - course_run + - operation: flatten + row_limit: 10 + series_columns: [] + series_limit: 0 + time_offsets: [] + url_params: {} + result_format: json + result_type: full +slice_name: Learner Performance Breakdown +uuid: 9c3f7291-1bd9-4b2f-abc0-472aad3aff06 +version: 1.0.0 +viz_type: echarts_timeseries_bar diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_dde44a.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_dde44a.yaml new file mode 100644 index 000000000..13f3d55bc --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_dde44a.yaml @@ -0,0 +1,146 @@ +_file_name: Learner_Performance_dde44a.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: ffc33796-bcd4-4e8b-a4e4-ab6517b72116 +description: |- +
+
Avg % Correct on 1st Attempt
+
The average percentage of correct answers on the first attempt
+
+params: + adhoc_filters: + - clause: WHERE + comparator: No filter + datasourceWarning: false + expressionType: SIMPLE + filterOptionName: filter_qqnzi3klvaa_mtbj67olly + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: null + subject: emission_time + all_columns: + - success + annotation_layers: [] + color_pn: true + column_config: + avg_course_grade: + d3NumberFormat: ',.1%' + first_try_correct: + d3NumberFormat: ',.1%' + showCellBars: false + med_course_grade: + d3NumberFormat: ',.1%' + conditional_formatting: [] + extra_form_data: {} + groupby: + - course_run + - course_name + metrics: + - first_try_correct + - count_passing + - avg_course_grade + - med_course_grade + order_by_cols: [] + order_desc: false + percent_metrics: [] + query_mode: aggregate + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + table_timestamp_format: smart_date + temporal_columns_lookup: {} + time_grain_sqla: P1M + viz_type: table +query_context: + datasource: + id: 648 + type: table + force: false + form_data: + adhoc_filters: + - clause: WHERE + comparator: No filter + datasourceWarning: false + expressionType: SIMPLE + filterOptionName: filter_qqnzi3klvaa_mtbj67olly + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: null + subject: emission_time + all_columns: + - success + color_pn: true + column_config: + avg_course_grade: + d3NumberFormat: ',.1%' + first_try_correct: + d3NumberFormat: ',.1%' + showCellBars: false + med_course_grade: + d3NumberFormat: ',.1%' + conditional_formatting: [] + dashboards: + - 161 + datasource: 648__table + extra_form_data: {} + force: false + groupby: + - course_run + - course_name + metrics: + - first_try_correct + - count_passing + - avg_course_grade + - med_course_grade + order_by_cols: [] + order_desc: false + percent_metrics: [] + query_mode: aggregate + result_format: json + result_type: full + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + slice_id: 1292 + table_timestamp_format: smart_date + temporal_columns_lookup: {} + time_grain_sqla: P1M + viz_type: table + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - course_run + - course_name + custom_form_data: {} + custom_params: {} + extras: + having: '' + time_grain_sqla: P1M + where: '' + filters: + - col: emission_time + op: TEMPORAL_RANGE + val: No filter + metrics: + - first_try_correct + - count_passing + - avg_course_grade + - med_course_grade + order_desc: false + orderby: + - - first_try_correct + - false + post_processing: [] + row_limit: 50000 + series_limit: 0 + url_params: {} + result_format: json + result_type: full +slice_name: Learner Performance +uuid: dde44a03-649f-4d77-990b-a95be204e1ba +version: 1.0.0 +viz_type: table diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_123e1a.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_123e1a.yaml new file mode 100644 index 000000000..e9d23ad7b --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_123e1a.yaml @@ -0,0 +1,107 @@ +_file_name: Video_Engagement_123e1a.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: 82cb6b56-c713-4933-93a0-9de15c266c4b +description: null +params: + adhoc_filters: [] + all_columns: [] + color_pn: true + column_config: + rewatched_percent: + d3NumberFormat: ',.1%' + watched_percent: + d3NumberFormat: ',.1%' + conditional_formatting: [] + extra_form_data: {} + groupby: + - course_run + - course_name + metrics: + - watched_percent + - rewatched_percent + - video_count + - avg_video_length + order_by_cols: [] + order_desc: true + percent_metrics: [] + query_mode: aggregate + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + table_timestamp_format: smart_date + temporal_columns_lookup: {} + viz_type: table +query_context: + datasource: + id: 121 + type: table + force: false + form_data: + adhoc_filters: [] + all_columns: [] + color_pn: true + column_config: + rewatched_percent: + d3NumberFormat: ',.1%' + watched_percent: + d3NumberFormat: ',.1%' + conditional_formatting: [] + dashboards: + - 2441 + datasource: 121__table + extra_form_data: {} + force: false + groupby: + - course_run + - course_name + metrics: + - watched_percent + - rewatched_percent + - video_count + - avg_video_length + order_by_cols: [] + order_desc: true + percent_metrics: [] + query_mode: aggregate + result_format: json + result_type: full + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + slice_id: 1465 + table_timestamp_format: smart_date + temporal_columns_lookup: {} + viz_type: table + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - course_run + - course_name + custom_form_data: {} + custom_params: {} + extras: + having: '' + where: '' + filters: [] + metrics: + - watched_percent + - rewatched_percent + - video_count + - avg_video_length + order_desc: true + orderby: + - - watched_percent + - false + post_processing: [] + row_limit: 50000 + series_limit: 0 + url_params: {} + result_format: json + result_type: full +slice_name: Video Engagement +uuid: 123e1a89-585b-4104-872c-ef4f972f42a7 +version: 1.0.0 +viz_type: table diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_1cf14f.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_1cf14f.yaml new file mode 100644 index 000000000..5bf6bb483 --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_1cf14f.yaml @@ -0,0 +1,107 @@ +_file_name: Video_Engagement_1cf14f.yaml +cache_timeout: null +certification_details: null +certified_by: null +dataset_uuid: 82cb6b56-c713-4933-93a0-9de15c266c4b +description: null +params: + adhoc_filters: [] + all_columns: [] + color_pn: true + column_config: + rewatched_percent: + d3NumberFormat: ',.1%' + watched_percent: + d3NumberFormat: ',.1%' + conditional_formatting: [] + extra_form_data: {} + groupby: + - course_name + - org + metrics: + - watched_percent + - rewatched_percent + - video_count + - avg_video_length + order_by_cols: [] + order_desc: true + percent_metrics: [] + query_mode: aggregate + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + table_timestamp_format: smart_date + temporal_columns_lookup: {} + viz_type: table +query_context: + datasource: + id: 121 + type: table + force: false + form_data: + adhoc_filters: [] + all_columns: [] + color_pn: true + column_config: + rewatched_percent: + d3NumberFormat: ',.1%' + watched_percent: + d3NumberFormat: ',.1%' + conditional_formatting: [] + dashboards: + - 2441 + datasource: 121__table + extra_form_data: {} + force: false + groupby: + - course_name + - org + metrics: + - watched_percent + - rewatched_percent + - video_count + - avg_video_length + order_by_cols: [] + order_desc: true + percent_metrics: [] + query_mode: aggregate + result_format: json + result_type: full + row_limit: 50000 + server_page_length: 10 + show_cell_bars: false + slice_id: 1361 + table_timestamp_format: smart_date + temporal_columns_lookup: {} + viz_type: table + queries: + - annotation_layers: [] + applied_time_extras: {} + columns: + - course_name + - org + custom_form_data: {} + custom_params: {} + extras: + having: '' + where: '' + filters: [] + metrics: + - watched_percent + - rewatched_percent + - video_count + - avg_video_length + order_desc: true + orderby: + - - watched_percent + - false + post_processing: [] + row_limit: 50000 + series_limit: 0 + url_params: {} + result_format: json + result_type: full +slice_name: Video Engagement +uuid: 1cf14f26-6957-482c-9dde-649c2c65ec13 +version: 1.0.0 +viz_type: table diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/dashboards/Course_Comparison_Dashboard.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/dashboards/Course_Comparison_Dashboard.yaml new file mode 100644 index 000000000..69972d060 --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/dashboards/Course_Comparison_Dashboard.yaml @@ -0,0 +1,672 @@ +_file_name: Course_Comparison_Dashboard.yaml +_roles: +- '{{ SUPERSET_ROLES_MAPPING.instructor }}' +certification_details: '' +certified_by: '' +css: '' +dashboard_title: Course Comparison Dashboard +description: null +metadata: + chart_configuration: + '1081': + crossFilters: + chartsInScope: + - 121 + - 161 + - 221 + - 421 + - 801 + - 1181 + - 1381 + - 1465 + - 1466 + scope: global + id: 1081 + '1181': + crossFilters: + chartsInScope: + - 121 + - 161 + - 221 + - 421 + - 801 + - 1081 + - 1381 + - 1465 + - 1466 + scope: global + id: 1181 + '121': + crossFilters: + chartsInScope: + - 161 + - 221 + - 421 + - 801 + - 1081 + - 1181 + - 1381 + - 1465 + - 1466 + scope: global + id: 121 + '1381': + crossFilters: + chartsInScope: + - 121 + - 161 + - 221 + - 421 + - 801 + - 1081 + - 1181 + - 1465 + - 1466 + scope: global + id: 1381 + '1465': + crossFilters: + chartsInScope: + - 121 + - 161 + - 221 + - 421 + - 801 + - 1081 + - 1181 + - 1381 + - 1466 + scope: global + id: 1465 + '1466': + crossFilters: + chartsInScope: + - 121 + - 161 + - 221 + - 421 + - 801 + - 1081 + - 1181 + - 1381 + - 1465 + scope: global + id: 1466 + '161': + crossFilters: + chartsInScope: + - 121 + - 221 + - 421 + - 801 + - 1081 + - 1181 + - 1381 + - 1465 + - 1466 + scope: global + id: 161 + '221': + crossFilters: + chartsInScope: + - 121 + - 161 + - 421 + - 801 + - 1081 + - 1181 + - 1381 + - 1465 + - 1466 + scope: global + id: 221 + '421': + crossFilters: + chartsInScope: + - 121 + - 161 + - 221 + - 801 + - 1081 + - 1181 + - 1381 + - 1465 + - 1466 + scope: global + id: 421 + '801': + crossFilters: + chartsInScope: + - 121 + - 161 + - 221 + - 421 + - 1081 + - 1181 + - 1381 + - 1465 + - 1466 + scope: global + id: 801 + color_scheme: supersetColors + color_scheme_domain: + - '#1FA8C9' + - '#454E7C' + - '#5AC189' + - '#FF7F44' + - '#666666' + - '#E04355' + - '#FCC700' + - '#A868B7' + - '#3CCCCB' + - '#A38F79' + - '#8FD3E4' + - '#A1A6BD' + - '#ACE1C4' + - '#FEC0A1' + - '#B2B2B2' + - '#EFA1AA' + - '#FDE380' + - '#D3B3DA' + - '#9EE5E5' + - '#D1C6BC' + cross_filters_enabled: true + default_filters: '{}' + expanded_slices: + '121': true + '221': true + '421': true + '801': true + global_chart_configuration: + chartsInScope: + - 121 + - 161 + - 221 + - 421 + - 801 + - 1081 + - 1181 + - 1381 + - 1465 + - 1466 + scope: + excluded: [] + rootPath: + - ROOT_ID + label_colors: {} + native_filter_configuration: + - cascadeParentIds: [] + chartsInScope: + - 1273 + - 1274 + - 1275 + - 1276 + - 1277 + - 1278 + - 1279 + - 1292 + - 1294 + - 1295 + controlValues: + defaultToFirstItem: true + enableEmptyFilter: false + inverseSelection: false + multiSelect: true + searchAllOptions: false + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + description: '' + filterType: filter_select + id: NATIVE_FILTER-QrTlO4wBf + name: Organization + requiredFirst: true + scope: + excluded: [] + rootPath: + - ROOT_ID + tabsInScope: + - TAB-J31MdXj-sa + - TAB-GuHDMLqRC + targets: + - column: + name: org + datasetUuid: 38488934-35ee-5404-9acc-7e67626ddfae + type: NATIVE_FILTER + - cascadeParentIds: [] + chartsInScope: [] + controlValues: + defaultToFirstItem: false + enableEmptyFilter: false + inverseSelection: false + multiSelect: true + searchAllOptions: false + sortAscending: true + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + description: Only available in versions Redwood and later + filterType: filter_select + id: NATIVE_FILTER-M1zEXEB97 + name: Tag + scope: + excluded: [] + rootPath: + - ROOT_ID + sortMetric: order + tabsInScope: [] + targets: + - column: + name: tag + datasetUuid: 81457874-fd86-4568-a730-9179ab7a7fd5 + type: NATIVE_FILTER + - cascadeParentIds: + - NATIVE_FILTER-QrTlO4wBf + - NATIVE_FILTER-M1zEXEB97 + chartsInScope: + - 1266 + - 1273 + - 1274 + - 1275 + - 1276 + - 1277 + - 1278 + - 1279 + controlValues: + defaultToFirstItem: false + enableEmptyFilter: false + inverseSelection: false + multiSelect: true + searchAllOptions: false + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + description: '' + filterType: filter_select + id: NATIVE_FILTER-IfS-Rd0ZS + name: Course Name + scope: + excluded: [] + rootPath: + - ROOT_ID + tabsInScope: + - TAB-J31MdXj-sa + - TAB-GuHDMLqRC + targets: + - column: + name: course_name + datasetUuid: 38488934-35ee-5404-9acc-7e67626ddfae + type: NATIVE_FILTER + - cascadeParentIds: + - NATIVE_FILTER-M1zEXEB97 + - NATIVE_FILTER-QrTlO4wBf + chartsInScope: + - 1266 + - 1273 + - 1274 + - 1275 + - 1276 + - 1277 + - 1278 + - 1279 + controlValues: + defaultToFirstItem: false + enableEmptyFilter: false + inverseSelection: false + multiSelect: true + searchAllOptions: false + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + description: '' + filterType: filter_select + id: NATIVE_FILTER-w863AfFgi + name: Course Run + scope: + excluded: [] + rootPath: + - ROOT_ID + tabsInScope: + - TAB-J31MdXj-sa + - TAB-GuHDMLqRC + targets: + - column: + name: course_run + datasetUuid: 38488934-35ee-5404-9acc-7e67626ddfae + type: NATIVE_FILTER + refresh_frequency: 0 + shared_label_colors: + active: '#1FA8C9' + at_risk: '#5AC189' + count: '#FCC700' + passed: '#666666' + timed_refresh_immune_slices: [] +position: + CHART-explore-1273-1: + children: [] + id: CHART-explore-1273-1 + meta: + chartId: 1181 + height: 49 + sliceName: Course Info + uuid: a433e3cc-8ed5-454a-8b17-5dd75cfc84e4 + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + - ROW-otbcoXVOj + type: CHART + CHART-explore-1274-1: + children: [] + id: CHART-explore-1274-1 + meta: + chartId: 1381 + height: 49 + sliceName: Course Info + uuid: e0098cfe-a312-4c49-8efd-7e74256b6ea4 + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-GuHDMLqRC + - ROW-vepcifelF + type: CHART + CHART-explore-1275-1: + children: [] + id: CHART-explore-1275-1 + meta: + chartId: 421 + height: 67 + sliceName: Learner Performance Breakdown + uuid: 4250c976-a9b7-43ff-b5ad-8dd00a5acef7 + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + - ROW-EDze1WWiC + type: CHART + CHART-explore-1276-1: + children: [] + id: CHART-explore-1276-1 + meta: + chartId: 801 + height: 67 + sliceName: Learner Performance Breakdown + uuid: 9c3f7291-1bd9-4b2f-abc0-472aad3aff06 + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-GuHDMLqRC + - ROW-O1XuzgpIo + type: CHART + CHART-explore-1279-1: + children: [] + id: CHART-explore-1279-1 + meta: + chartId: 121 + height: 51 + sliceName: Learner Performance + uuid: 4e48b8f9-e757-4263-a9d7-d18018620a24 + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + - ROW-y57KZVzDt + type: CHART + CHART-explore-1292-1: + children: [] + id: CHART-explore-1292-1 + meta: + chartId: 221 + height: 51 + sliceName: Learner Performance + uuid: dde44a03-649f-4d77-990b-a95be204e1ba + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-GuHDMLqRC + - ROW--27JFXNWc + type: CHART + CHART-explore-1294-1: + children: [] + id: CHART-explore-1294-1 + meta: + chartId: 161 + height: 49 + sliceName: Enrollment Counts + uuid: 2f2af8b0-94ae-4300-b71f-3bd7f9fc127c + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + - ROW-FolfXlYAh + type: CHART + CHART-explore-1295-1: + children: [] + id: CHART-explore-1295-1 + meta: + chartId: 1081 + height: 49 + sliceName: Enrollment Counts + uuid: bd37be7f-6672-4dca-80ae-a54f69d169da + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-GuHDMLqRC + - ROW-17CIe_GHN + type: CHART + CHART-explore-1465-1: + children: [] + id: CHART-explore-1465-1 + meta: + chartId: 1465 + height: 50 + sliceName: Video Engagement + uuid: 1cf14f26-6957-482c-9dde-649c2c65ec13 + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + - ROW-ea7R1H5r0q + type: CHART + CHART-explore-1466-1: + children: [] + id: CHART-explore-1466-1 + meta: + chartId: 1466 + height: 50 + sliceName: Video Engagement + uuid: 123e1a89-585b-4104-872c-ef4f972f42a7 + width: 12 + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + - ROW-ksE1lVL9ko + type: CHART + DASHBOARD_VERSION_KEY: v2 + GRID_ID: + children: [] + id: GRID_ID + parents: + - ROOT_ID + type: GRID + HEADER_ID: + id: HEADER_ID + meta: + text: Course Comparison Dashboard + type: HEADER + ROOT_ID: + children: + - TABS-6vozRyRn2o + id: ROOT_ID + type: ROOT + ROW--27JFXNWc: + children: + - CHART-explore-1292-1 + id: ROW--27JFXNWc + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-GuHDMLqRC + type: ROW + ROW-17CIe_GHN: + children: + - CHART-explore-1295-1 + id: ROW-17CIe_GHN + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-GuHDMLqRC + type: ROW + ROW-EDze1WWiC: + children: + - CHART-explore-1275-1 + id: ROW-EDze1WWiC + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + type: ROW + ROW-FolfXlYAh: + children: + - CHART-explore-1294-1 + id: ROW-FolfXlYAh + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + type: ROW + ROW-FvlinEtRl: + children: + - CHART-explore-1466-1 + id: ROW-FvlinEtRl + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-GuHDMLqRC + type: ROW + ROW-O1XuzgpIo: + children: + - CHART-explore-1276-1 + id: ROW-O1XuzgpIo + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-GuHDMLqRC + type: ROW + ROW-ea7R1H5r0q: + children: + - CHART-explore-1465-1 + id: ROW-ea7R1H5r0q + meta: + '0': ROOT_ID + '1': TABS-6vozRyRn2o + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + type: ROW + ROW-otbcoXVOj: + children: + - CHART-explore-1273-1 + id: ROW-otbcoXVOj + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + type: ROW + ROW-vepcifelF: + children: + - CHART-explore-1274-1 + id: ROW-vepcifelF + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-GuHDMLqRC + type: ROW + ROW-y57KZVzDt: + children: + - CHART-explore-1279-1 + id: ROW-y57KZVzDt + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - TABS-6vozRyRn2o + - TAB-J31MdXj-sa + type: ROW + TAB-GuHDMLqRC: + children: + - ROW-vepcifelF + - ROW-17CIe_GHN + - ROW-O1XuzgpIo + - ROW--27JFXNWc + - ROW-FvlinEtRl + id: TAB-GuHDMLqRC + meta: + defaultText: Tab title + placeholder: Tab title + text: Run Metrics + parents: + - ROOT_ID + - TABS-6vozRyRn2o + type: TAB + TAB-J31MdXj-sa: + children: + - ROW-otbcoXVOj + - ROW-FolfXlYAh + - ROW-EDze1WWiC + - ROW-y57KZVzDt + - ROW-ea7R1H5r0q + id: TAB-J31MdXj-sa + meta: + defaultText: Tab title + placeholder: Tab title + text: Course Metrics + parents: + - ROOT_ID + - TABS-6vozRyRn2o + type: TAB + TABS-6vozRyRn2o: + children: + - TAB-J31MdXj-sa + - TAB-GuHDMLqRC + id: TABS-6vozRyRn2o + meta: {} + parents: + - ROOT_ID + type: TABS +published: true +slug: course-comparison +uuid: c6c7062d-dd90-4292-b9cf-84f7b9f38e73 +version: 1.0.0 diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/course_information.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/course_information.yaml new file mode 100644 index 000000000..a78b564eb --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/course_information.yaml @@ -0,0 +1,154 @@ +_file_name: course_information.yaml +always_filter_main_dttm: false +cache_timeout: null +columns: +- advanced_data_type: null + column_name: active_learner + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: Nullable(String) + verbose_name: Active Learner +- advanced_data_type: null + column_name: enrollment_mode + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: LowCardinality(String) + verbose_name: Enrollment Mode +- advanced_data_type: null + column_name: actor_id + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Actor Id +- advanced_data_type: null + column_name: course_name + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Name +- advanced_data_type: null + column_name: course_run + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Run +- advanced_data_type: null + column_name: course_tag + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Tag +- advanced_data_type: null + column_name: org + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: LowCardinality(String) + verbose_name: Org +database_uuid: 21174b6c-4d40-4958-8161-d6c3cf5e77b6 +default_endpoint: null +description: null +extra: null +fetch_values_predicate: null +filter_select_enabled: true +main_dttm_col: emission_time +metrics: +- currency: null + d3format: null + description: null + expression: uniq((active_learner,course_run)) + extra: + warning_markdown: '' + metric_name: active_count + metric_type: null + verbose_name: Active Within Last 7 Days + warning_text: null +- currency: null + d3format: null + description: null + expression: |- + replaceAll(replaceRegexpAll(toString(groupArray(distinct course_tag)),'\[|\]|\'',''),',',', ') + extra: + warning_markdown: '' + metric_name: tag_list + metric_type: null + verbose_name: Tags + warning_text: null +- currency: null + d3format: null + description: null + expression: uniq((actor_id,course_run)) + extra: + warning_markdown: '' + metric_name: enrollees + metric_type: null + verbose_name: Current Enrollees + warning_text: null +- currency: null + d3format: null + description: null + expression: COUNT(*) + extra: + warning_markdown: '' + metric_name: count + metric_type: count + verbose_name: COUNT(*) + warning_text: null +normalize_columns: false +offset: 0 +params: null +schema: '{{ DBT_PROFILE_TARGET_DATABASE }}' +sql: |- + {% filter indent(width=2) %}{% include 'openedx-assets/queries/course_information.sql' %}{% endfilter %} +table_name: course_information +template_params: null +uuid: 27a4476b-5a9a-4fc4-ac75-da520b522341 +version: 1.0.0 diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/learner_performance.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/learner_performance.yaml new file mode 100644 index 000000000..0083cfde0 --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/learner_performance.yaml @@ -0,0 +1,191 @@ +_file_name: learner_performance.yaml +always_filter_main_dttm: false +cache_timeout: null +columns: +- advanced_data_type: null + column_name: course_key + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: LowCardinality(String) + verbose_name: Course Key +- advanced_data_type: null + column_name: course_grade + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: Float64 + verbose_name: Course Grade +- advanced_data_type: null + column_name: actor_id + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Actor ID +- advanced_data_type: null + column_name: course_name + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Name +- advanced_data_type: null + column_name: course_run + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Run +- advanced_data_type: null + column_name: org + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: LowCardinality(String) + verbose_name: Org +- advanced_data_type: null + column_name: approving_state + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Pass/Fail +- advanced_data_type: null + column_name: attempts + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: Int16 + verbose_name: Attempts +- advanced_data_type: null + column_name: success + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: Bool + verbose_name: Success +database_uuid: 21174b6c-4d40-4958-8161-d6c3cf5e77b6 +default_endpoint: null +description: null +extra: null +fetch_values_predicate: null +filter_select_enabled: true +main_dttm_col: null +metrics: +- currency: null + d3format: null + description: null + expression: count(distinct case when attempts = 1 and success then actor_id else + null end)/count(distinct case when attempts > 0 then actor_id else null end) + extra: + warning_markdown: '' + metric_name: first_try_correct + metric_type: null + verbose_name: Avg % Correct on 1st Attempt + warning_text: null +- currency: null + d3format: null + description: null + expression: |- + count(distinct case when approving_state = 'passed' then actor_id else null end) + extra: + warning_markdown: '' + metric_name: count_passing + metric_type: null + verbose_name: Count of Passing Grades + warning_text: null +- currency: null + d3format: null + description: null + expression: 'quantile(0.5)(round(course_grade,2)) ' + extra: + warning_markdown: '' + metric_name: med_course_grade + metric_type: null + verbose_name: Median Course Grade + warning_text: null +- currency: null + d3format: null + description: null + expression: round(AVG(course_grade),2) + extra: + warning_markdown: '' + metric_name: avg_course_grade + metric_type: null + verbose_name: Avg Course Grade + warning_text: null +- currency: null + d3format: null + description: null + expression: COUNT(*) + extra: + warning_markdown: '' + metric_name: count + metric_type: count + verbose_name: COUNT(*) + warning_text: null +normalize_columns: false +offset: 0 +params: null +schema: '{{ DBT_PROFILE_TARGET_DATABASE }}' +sql: |- + {% filter indent(width=2) %}{% include 'openedx-assets/queries/learner_performance.sql' %}{% endfilter %} +table_name: learner_performance +template_params: null +uuid: ffc33796-bcd4-4e8b-a4e4-ab6517b72116 +version: 1.0.0 diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/learner_performance_breakdown.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/learner_performance_breakdown.yaml new file mode 100644 index 000000000..50def3811 --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/learner_performance_breakdown.yaml @@ -0,0 +1,143 @@ +_file_name: learner_performance_breakdown.yaml +always_filter_main_dttm: false +cache_timeout: null +columns: +- advanced_data_type: null + column_name: actor_id + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Actor Id +- advanced_data_type: null + column_name: approving_state + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Approving State +- advanced_data_type: null + column_name: course_name + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Name +- advanced_data_type: null + column_name: course_run + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Run +- advanced_data_type: null + column_name: learner_status + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Learner Status +- advanced_data_type: null + column_name: org + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: LowCardinality(String) + verbose_name: Org +database_uuid: 21174b6c-4d40-4958-8161-d6c3cf5e77b6 +default_endpoint: null +description: null +extra: null +fetch_values_predicate: null +filter_select_enabled: true +main_dttm_col: enrolled_at +metrics: +- currency: null + d3format: null + description: null + expression: |- + count(case when learner_status='at-risk' then actor_id else null end) + extra: + warning_markdown: '' + metric_name: at_risk + metric_type: null + verbose_name: At Risk + warning_text: null +- currency: null + d3format: null + description: null + expression: |- + count(case when learner_status='active' then actor_id else null end) + extra: + warning_markdown: '' + metric_name: active + metric_type: null + verbose_name: Active + warning_text: null +- currency: null + d3format: null + description: null + expression: |- + count(case when approving_state='passed' then actor_id else null end) + extra: + warning_markdown: '' + metric_name: passed + metric_type: null + verbose_name: Passed + warning_text: null +- currency: null + d3format: null + description: null + expression: COUNT(actor_id) + extra: + warning_markdown: '' + metric_name: count + metric_type: count + verbose_name: Total + warning_text: null +normalize_columns: false +offset: 0 +params: null +schema: '{{ DBT_PROFILE_TARGET_DATABASE }}' +sql: |- + {% filter indent(width=2) %}{% include 'openedx-assets/queries/learner_performance_breakdown.sql' %}{% endfilter %} +table_name: learner_performance_breakdown +template_params: null +uuid: 1970f934-cffb-4c5a-8a13-69dab22755c7 +version: 1.0.0 diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/tag_filter.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/tag_filter.yaml new file mode 100644 index 000000000..563dc484e --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/tag_filter.yaml @@ -0,0 +1,76 @@ +_file_name: tag_filter.yaml +always_filter_main_dttm: false +cache_timeout: null +columns: +- advanced_data_type: null + column_name: id + description: null + expression: '' + extra: {} + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: Int32 + verbose_name: Id +- advanced_data_type: null + column_name: rownum + description: null + expression: '' + extra: {} + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: UInt64 + verbose_name: Rownum +- advanced_data_type: null + column_name: tag + description: null + expression: '' + extra: {} + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Tag +database_uuid: 21174b6c-4d40-4958-8161-d6c3cf5e77b6 +default_endpoint: null +description: null +extra: null +fetch_values_predicate: null +filter_select_enabled: true +main_dttm_col: null +metrics: +- currency: null + d3format: null + description: null + expression: COUNT(*) + extra: {} + metric_name: count + metric_type: count + verbose_name: COUNT(*) + warning_text: null +- currency: null + d3format: null + description: null + expression: min(rownum) + extra: {} + metric_name: order + metric_type: null + verbose_name: order + warning_text: null +normalize_columns: false +offset: 0 +params: null +schema: '{{ ASPECTS_EVENT_SINK_DATABASE }}' +sql: |- + {% filter indent(width=2) %}{% include 'openedx-assets/queries/tag_filter_dataset.sql' %}{% endfilter %} +table_name: tag_filter +template_params: null +uuid: 81457874-fd86-4568-a730-9179ab7a7fd5 +version: 1.0.0 diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/watched_video_duration.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/watched_video_duration.yaml new file mode 100644 index 000000000..6edec5e11 --- /dev/null +++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/watched_video_duration.yaml @@ -0,0 +1,180 @@ +_file_name: watched_video_duration.yaml +always_filter_main_dttm: false +cache_timeout: null +columns: +- advanced_data_type: null + column_name: course_name + description: null + expression: '' + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Name +- advanced_data_type: null + column_name: video_duration + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: Int64 + verbose_name: Video Duration +- advanced_data_type: null + column_name: course_run + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Run +- advanced_data_type: null + column_name: org + description: null + expression: null + extra: + warning_markdown: null + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Org +- advanced_data_type: null + column_name: rewatched_time + description: null + expression: null + extra: {} + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: Int64 + verbose_name: Rewatched Time +- advanced_data_type: null + column_name: watched_time + description: null + expression: null + extra: {} + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: Int64 + verbose_name: Watched Time +- advanced_data_type: null + column_name: actor_id + description: null + expression: null + extra: {} + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Actor Id +- advanced_data_type: null + column_name: course_key + description: null + expression: null + extra: {} + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Course Key +- advanced_data_type: null + column_name: video_id + description: null + expression: null + extra: {} + filterable: true + groupby: true + is_active: true + is_dttm: false + python_date_format: null + type: String + verbose_name: Video Id +database_uuid: 21174b6c-4d40-4958-8161-d6c3cf5e77b6 +default_endpoint: null +description: null +extra: null +fetch_values_predicate: null +filter_select_enabled: true +main_dttm_col: null +metrics: +- currency: null + d3format: null + description: null + expression: (sum(rewatched_time)/count(actor_id))/sum(video_duration) + extra: {} + metric_name: rewatched_percent + metric_type: null + verbose_name: '% Video Seconds Rewatched' + warning_text: null +- currency: null + d3format: null + description: null + expression: (sum(watched_time)/count(actor_id))/sum(video_duration) + extra: {} + metric_name: watched_percent + metric_type: null + verbose_name: '% Video Seconds Watched' + warning_text: null +- currency: null + d3format: null + description: null + expression: avg(video_duration) + extra: {} + metric_name: avg_video_length + metric_type: null + verbose_name: Avg Video Length (seconds) + warning_text: null +- currency: null + d3format: null + description: null + expression: count(distinct video_id) + extra: {} + metric_name: video_count + metric_type: null + verbose_name: Number of Videos + warning_text: null +- currency: null + d3format: null + description: null + expression: COUNT(*) + extra: + warning_markdown: '' + metric_name: count + metric_type: count + verbose_name: COUNT(*) + warning_text: null +normalize_columns: true +offset: 0 +params: null +schema: '{{ DBT_PROFILE_TARGET_DATABASE }}' +sql: |- + {% filter indent(width=2) %}{% include 'openedx-assets/queries/watched_video_duration.sql' %}{% endfilter %} +table_name: watched_video_duration +template_params: null +uuid: 82cb6b56-c713-4933-93a0-9de15c266c4b +version: 1.0.0 diff --git a/tutoraspects/templates/openedx-assets/queries/common_filters.sql b/tutoraspects/templates/openedx-assets/queries/common_filters.sql index a2467c646..f26d48ea4 100644 --- a/tutoraspects/templates/openedx-assets/queries/common_filters.sql +++ b/tutoraspects/templates/openedx-assets/queries/common_filters.sql @@ -11,3 +11,15 @@ ) {% endif %} {%- endraw %} + +{% raw -%} +{% if filter_values("tag") != [] %} + and course_key in ( + select course_key + from + {% endraw -%} {{ DBT_PROFILE_TARGET_DATABASE }}.most_recent_course_tags{%- raw %} + where + tag in (select replaceAll(arrayJoin({{ filter_values("tag") }}), '- ', '')) + ) +{% endif %} +{%- endraw %} diff --git a/tutoraspects/templates/openedx-assets/queries/course_information.sql b/tutoraspects/templates/openedx-assets/queries/course_information.sql new file mode 100644 index 000000000..c6420396d --- /dev/null +++ b/tutoraspects/templates/openedx-assets/queries/course_information.sql @@ -0,0 +1,27 @@ +select + fes.org as org, + cn.course_name as course_name, + course_run, + fes.actor_id as actor_id, + fes.enrollment_mode as enrollment_mode, + case + when flfc.emission_time >= subtractDays(now(), 7) then actor_id else null + end as active_learner, + tag as course_tag, + fes.course_key as course_key +from {{ DBT_PROFILE_TARGET_DATABASE }}.fact_enrollment_status fes +left join + {{ ASPECTS_XAPI_DATABASE }}.fact_learner_last_course_visit flfc + on fes.org = flfc.org + and fes.course_key = flfc.course_key + and fes.actor_id = flfc.actor_id +left join + {{ ASPECTS_EVENT_SINK_DATABASE }}.course_names cn + on fes.org = cn.org + and fes.course_key = cn.course_key +left join + {{ DBT_PROFILE_TARGET_DATABASE }}.most_recent_course_tags mrct + on mrct.course_key = fes.course_key +where + enrollment_status = 'registered' + {% include 'openedx-assets/queries/common_filters.sql' %} diff --git a/tutoraspects/templates/openedx-assets/queries/learner_performance.sql b/tutoraspects/templates/openedx-assets/queries/learner_performance.sql new file mode 100644 index 000000000..6c7829470 --- /dev/null +++ b/tutoraspects/templates/openedx-assets/queries/learner_performance.sql @@ -0,0 +1,14 @@ +select + org, + course_key, + course_name, + course_run, + actor_id, + success, + attempts, + course_grade, + approving_state +from {{ DBT_PROFILE_TARGET_DATABASE }}.fact_student_status +left join {{ DBT_PROFILE_TARGET_DATABASE }}.int_problem_results +using org, course_key, course_run, actor_id, course_name +where 1 = 1 {% include 'openedx-assets/queries/common_filters.sql' %} diff --git a/tutoraspects/templates/openedx-assets/queries/learner_performance_breakdown.sql b/tutoraspects/templates/openedx-assets/queries/learner_performance_breakdown.sql new file mode 100644 index 000000000..595a33ebf --- /dev/null +++ b/tutoraspects/templates/openedx-assets/queries/learner_performance_breakdown.sql @@ -0,0 +1,21 @@ +select + org, + actor_id, + course_name, + course_run, + approving_state, + case + when fllcv.emission_time >= subtractDays(now(), 7) + then 'active' + when + fllcv.emission_time < subtractDays(now(), 7) + and approving_state = 'failed' + and enrollment_status = 'registered' + then 'at-risk' + else 'other' + end as learner_status, + fss.course_key as course_key +from {{ DBT_PROFILE_TARGET_DATABASE }}.fact_student_status fss +left join {{ ASPECTS_XAPI_DATABASE }}.fact_learner_last_course_visit fllcv +using org, course_key, actor_id +where 1 = 1 {% include 'openedx-assets/queries/common_filters.sql' %} diff --git a/tutoraspects/templates/openedx-assets/queries/tag_filter_dataset.sql b/tutoraspects/templates/openedx-assets/queries/tag_filter_dataset.sql new file mode 100644 index 000000000..05bc2a308 --- /dev/null +++ b/tutoraspects/templates/openedx-assets/queries/tag_filter_dataset.sql @@ -0,0 +1,12 @@ +with + data as ( + select + id, + case when parent = 0 then id else cast(parent as int) end as sort_order_1, + case when parent = 0 then 0 else 1 end as sort_order_2, + concat(repeat('- ', countMatches(lineage, ',')), value) as tag, + row_number() over (order by sort_order_1, sort_order_2, value) as rownum + from {{ ASPECTS_EVENT_SINK_DATABASE }}.most_recent_tags + ) +select id, rownum, tag +from data diff --git a/tutoraspects/templates/openedx-assets/queries/watched_video_duration.sql b/tutoraspects/templates/openedx-assets/queries/watched_video_duration.sql new file mode 100644 index 000000000..413943797 --- /dev/null +++ b/tutoraspects/templates/openedx-assets/queries/watched_video_duration.sql @@ -0,0 +1,14 @@ +select + names.org as org, + names.course_key as course_key, + names.course_name as course_name, + names.course_run as course_run, + actor_id, + video_id, + video_duration, + watched_time, + rewatched_time +from {{ ASPECTS_EVENT_SINK_DATABASE }}.watched_video_duration +left join {{ ASPECTS_EVENT_SINK_DATABASE }}.course_names as names +using org, course_key +where 1 = 1 {% include 'openedx-assets/queries/common_filters.sql' %}