diff --git a/tutoraspects/plugin.py b/tutoraspects/plugin.py
index 5e8fd94e2..264babaf4 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.1"),
("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/Dockerfile b/tutoraspects/templates/aspects/build/aspects-superset/Dockerfile
index 1ebc30fdd..a8c1bcaef 100644
--- a/tutoraspects/templates/aspects/build/aspects-superset/Dockerfile
+++ b/tutoraspects/templates/aspects/build/aspects-superset/Dockerfile
@@ -3,7 +3,7 @@
# https://github.com/apache/superset/releases
# https://github.com/apache/superset/blob/master/Dockerfile
# https://superset.apache.org/docs/databases/installing-database-drivers
-FROM apache/superset:4.0.1
+FROM apache/superset:4.0.2
USER root
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_b2fff8.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_b2fff8.yaml
new file mode 100644
index 000000000..9829dfb49
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_b2fff8.yaml
@@ -0,0 +1,132 @@
+_file_name: Course_Info_b2fff8.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: []
+ 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: 221
+ 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:
+ - 3141
+ datasource: 221__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: 1181
+ 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: b2fff8a7-3ace-4075-9a3f-5fa5b99f81bb
+version: 1.0.0
+viz_type: table
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_ccdd7d.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_ccdd7d.yaml
new file mode 100644
index 000000000..98d55008d
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_ccdd7d.yaml
@@ -0,0 +1,132 @@
+_file_name: Course_Info_ccdd7d.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: []
+ 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: 221
+ 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:
+ - 3141
+ datasource: 221__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: 1381
+ 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: ccdd7d98-4722-490b-a0b2-077380a7c7eb
+version: 1.0.0
+viz_type: table
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_7eaf5b.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_7eaf5b.yaml
new file mode 100644
index 000000000..10a5b8dcb
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_7eaf5b.yaml
@@ -0,0 +1,103 @@
+_file_name: Enrollment_Counts_7eaf5b.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
+ 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: 221
+ 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:
+ - 3141
+ datasource: 221__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: 161
+ 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: 7eaf5bc2-0067-424b-a50b-607cf54c086a
+version: 1.0.0
+viz_type: pivot_table_v2
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_8230a3.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_8230a3.yaml
new file mode 100644
index 000000000..97ab78eb9
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_8230a3.yaml
@@ -0,0 +1,103 @@
+_file_name: Enrollment_Counts_8230a3.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
+ 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: 221
+ 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:
+ - 3141
+ datasource: 221__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: 1081
+ 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: 8230a366-957d-4667-a2ff-3cbcb2f25f60
+version: 1.0.0
+viz_type: pivot_table_v2
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_b73b0a.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_b73b0a.yaml
new file mode 100644
index 000000000..36bf9a8dc
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_b73b0a.yaml
@@ -0,0 +1,157 @@
+_file_name: Learner_Performance_Breakdown_b73b0a.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
+ contributionMode: null
+ extra_form_data: {}
+ groupby: []
+ legendMargin: null
+ legendOrientation: top
+ legendType: scroll
+ metrics:
+ - count
+ - passed
+ - active
+ - at_risk
+ minorTicks: false
+ 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
+ tooltipTimeFormat: smart_date
+ truncateXAxis: false
+ truncate_metric: false
+ viz_type: echarts_timeseries_bar
+ xAxisLabelRotation: 0
+ x_axis: course_name
+ 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
+ zoomable: false
+query_context:
+ datasource:
+ id: 464
+ 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
+ contributionMode: null
+ dashboards:
+ - 3441
+ datasource: 464__table
+ extra_form_data: {}
+ force: false
+ groupby: []
+ legendMargin: null
+ legendOrientation: top
+ legendType: scroll
+ metrics:
+ - count
+ - passed
+ - active
+ - at_risk
+ minorTicks: false
+ 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: 1504
+ sort_series_ascending: true
+ sort_series_type: name
+ stack: null
+ tooltipTimeFormat: smart_date
+ truncateXAxis: false
+ truncate_metric: false
+ viz_type: echarts_timeseries_bar
+ xAxisLabelRotation: 0
+ x_axis: course_name
+ 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
+ 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: b73b0a5c-4861-402e-a39c-d73333a4d911
+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_d414b1.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_d414b1.yaml
new file mode 100644
index 000000000..43f8b4606
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_Breakdown_d414b1.yaml
@@ -0,0 +1,169 @@
+_file_name: Learner_Performance_Breakdown_d414b1.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
+ contributionMode: null
+ extra_form_data: {}
+ groupby: []
+ legendMargin: 0
+ legendOrientation: top
+ legendType: scroll
+ metrics:
+ - passed
+ - count
+ - at_risk
+ - active
+ minorTicks: false
+ 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
+ tooltipTimeFormat: smart_date
+ truncateXAxis: false
+ truncate_metric: true
+ viz_type: echarts_timeseries_bar
+ xAxisLabelRotation: 0
+ x_axis: course_run
+ 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
+ zoomable: false
+query_context:
+ datasource:
+ id: 464
+ 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
+ contributionMode: null
+ dashboards:
+ - 3441
+ datasource: 464__table
+ extra_form_data: {}
+ force: false
+ groupby: []
+ legendMargin: 0
+ legendOrientation: top
+ legendType: scroll
+ metrics:
+ - passed
+ - count
+ - at_risk
+ - active
+ minorTicks: false
+ 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: 1505
+ sort_series_ascending: true
+ sort_series_type: name
+ stack: null
+ timeseries_limit_metric: null
+ tooltipTimeFormat: smart_date
+ truncateXAxis: false
+ truncate_metric: true
+ viz_type: echarts_timeseries_bar
+ xAxisLabelRotation: 0
+ x_axis: course_run
+ 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
+ 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: d414b144-467b-456b-b899-9cfb3579faba
+version: 1.0.0
+viz_type: echarts_timeseries_bar
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_b0e170.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_b0e170.yaml
new file mode 100644
index 000000000..5b7ae82bb
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_b0e170.yaml
@@ -0,0 +1,145 @@
+_file_name: Learner_Performance_b0e170.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
+ 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: 61
+ 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:
+ - 3141
+ datasource: 61__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: 1507
+ 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: b0e170ce-26f1-4452-a3c0-49b41fa6e529
+version: 1.0.0
+viz_type: table
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_b518f3.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_b518f3.yaml
new file mode 100644
index 000000000..cdb62bff7
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_b518f3.yaml
@@ -0,0 +1,122 @@
+_file_name: Learner_Performance_b518f3.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
+ 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: 61
+ 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:
+ - 3141
+ datasource: 61__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: 1506
+ 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: b518f341-9ed4-4c23-bb88-6c1d497aa260
+version: 1.0.0
+viz_type: table
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_5b00f7.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_5b00f7.yaml
new file mode 100644
index 000000000..caf733e61
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_5b00f7.yaml
@@ -0,0 +1,107 @@
+_file_name: Video_Engagement_5b00f7.yaml
+cache_timeout: null
+certification_details: null
+certified_by: null
+dataset_uuid: 82cb6b56-c713-4933-93a0-9de15c266c4b
+description: null
+params:
+ adhoc_filters: []
+ all_columns: []
+ annotation_layers: []
+ 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: 746
+ type: table
+ force: false
+ form_data:
+ adhoc_filters: []
+ all_columns: []
+ annotation_layers: []
+ color_pn: true
+ column_config:
+ rewatched_percent:
+ d3NumberFormat: ',.1%'
+ watched_percent:
+ d3NumberFormat: ',.1%'
+ conditional_formatting: []
+ datasource: 746__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: 1467
+ 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: 5b00f792-233c-4ee6-9411-7df49f4b5061
+version: 1.0.0
+viz_type: table
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_6b7610.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_6b7610.yaml
new file mode 100644
index 000000000..fd1a38535
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_6b7610.yaml
@@ -0,0 +1,107 @@
+_file_name: Video_Engagement_6b7610.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: 746
+ 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:
+ - 3141
+ datasource: 746__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: 1508
+ 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: 6b7610a7-41d0-4d14-be81-62a5a8f22d62
+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..416f79c07
--- /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:
+ '1467':
+ crossFilters:
+ chartsInScope:
+ - 1500
+ - 1501
+ - 1502
+ - 1503
+ - 1504
+ - 1505
+ - 1506
+ - 1507
+ - 1508
+ scope: global
+ id: 1467
+ '1500':
+ crossFilters:
+ chartsInScope:
+ - 1467
+ - 1501
+ - 1502
+ - 1503
+ - 1504
+ - 1505
+ - 1506
+ - 1507
+ - 1508
+ scope: global
+ id: 1500
+ '1501':
+ crossFilters:
+ chartsInScope:
+ - 1467
+ - 1500
+ - 1502
+ - 1503
+ - 1504
+ - 1505
+ - 1506
+ - 1507
+ - 1508
+ scope: global
+ id: 1501
+ '1502':
+ crossFilters:
+ chartsInScope:
+ - 1467
+ - 1500
+ - 1501
+ - 1503
+ - 1504
+ - 1505
+ - 1506
+ - 1507
+ - 1508
+ scope: global
+ id: 1502
+ '1503':
+ crossFilters:
+ chartsInScope:
+ - 1467
+ - 1500
+ - 1501
+ - 1502
+ - 1504
+ - 1505
+ - 1506
+ - 1507
+ - 1508
+ scope: global
+ id: 1503
+ '1504':
+ crossFilters:
+ chartsInScope:
+ - 1467
+ - 1500
+ - 1501
+ - 1502
+ - 1503
+ - 1505
+ - 1506
+ - 1507
+ - 1508
+ scope: global
+ id: 1504
+ '1505':
+ crossFilters:
+ chartsInScope:
+ - 1467
+ - 1500
+ - 1501
+ - 1502
+ - 1503
+ - 1504
+ - 1506
+ - 1507
+ - 1508
+ scope: global
+ id: 1505
+ '1506':
+ crossFilters:
+ chartsInScope:
+ - 1467
+ - 1500
+ - 1501
+ - 1502
+ - 1503
+ - 1504
+ - 1505
+ - 1507
+ - 1508
+ scope: global
+ id: 1506
+ '1507':
+ crossFilters:
+ chartsInScope:
+ - 1467
+ - 1500
+ - 1501
+ - 1502
+ - 1503
+ - 1504
+ - 1505
+ - 1506
+ - 1508
+ scope: global
+ id: 1507
+ '1508':
+ crossFilters:
+ chartsInScope:
+ - 1467
+ - 1500
+ - 1501
+ - 1502
+ - 1503
+ - 1504
+ - 1505
+ - 1506
+ - 1507
+ scope: global
+ id: 1508
+ 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:
+ '1504': true
+ '1505': true
+ '1506': true
+ '1507': true
+ global_chart_configuration:
+ chartsInScope:
+ - 1467
+ - 1500
+ - 1501
+ - 1502
+ - 1503
+ - 1504
+ - 1505
+ - 1506
+ - 1507
+ - 1508
+ 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-1467-1:
+ children: []
+ id: CHART-explore-1467-1
+ meta:
+ chartId: 1467
+ height: 50
+ sliceName: Video Engagement
+ uuid: 5b00f792-233c-4ee6-9411-7df49f4b5061
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ - ROW-dAYfW3JOym
+ type: CHART
+ CHART-explore-1500-1:
+ children: []
+ id: CHART-explore-1500-1
+ meta:
+ chartId: 1500
+ height: 50
+ sliceName: Course Info
+ uuid: b2fff8a7-3ace-4075-9a3f-5fa5b99f81bb
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ - ROW-Ixcwhxrj1
+ type: CHART
+ CHART-explore-1501-1:
+ children: []
+ id: CHART-explore-1501-1
+ meta:
+ chartId: 1501
+ height: 50
+ sliceName: Course Info
+ uuid: ccdd7d98-4722-490b-a0b2-077380a7c7eb
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ - ROW-_txCTpD7V
+ type: CHART
+ CHART-explore-1502-1:
+ children: []
+ id: CHART-explore-1502-1
+ meta:
+ chartId: 1502
+ height: 50
+ sliceName: Enrollment Counts
+ uuid: 7eaf5bc2-0067-424b-a50b-607cf54c086a
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ - ROW-RgmR2MvEK
+ type: CHART
+ CHART-explore-1503-1:
+ children: []
+ id: CHART-explore-1503-1
+ meta:
+ chartId: 1503
+ height: 50
+ sliceName: Enrollment Counts
+ uuid: 8230a366-957d-4667-a2ff-3cbcb2f25f60
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ - ROW-bpejHEOdb
+ type: CHART
+ CHART-explore-1504-1:
+ children: []
+ id: CHART-explore-1504-1
+ meta:
+ chartId: 1504
+ height: 50
+ sliceName: Learner Performance Breakdown
+ uuid: b73b0a5c-4861-402e-a39c-d73333a4d911
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ - ROW-dwdD7OF9Z
+ type: CHART
+ CHART-explore-1505-1:
+ children: []
+ id: CHART-explore-1505-1
+ meta:
+ chartId: 1505
+ height: 50
+ sliceName: Learner Performance Breakdown
+ uuid: d414b144-467b-456b-b899-9cfb3579faba
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ - ROW-XddLr_99f
+ type: CHART
+ CHART-explore-1506-1:
+ children: []
+ id: CHART-explore-1506-1
+ meta:
+ chartId: 1506
+ height: 50
+ sliceName: Learner Performance
+ uuid: b518f341-9ed4-4c23-bb88-6c1d497aa260
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ - ROW-hgxCVRi9M
+ type: CHART
+ CHART-explore-1507-1:
+ children: []
+ id: CHART-explore-1507-1
+ meta:
+ chartId: 1507
+ height: 50
+ sliceName: Learner Performance
+ uuid: b0e170ce-26f1-4452-a3c0-49b41fa6e529
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ - ROW-kZVNsJuoh
+ type: CHART
+ CHART-explore-1508-1:
+ children: []
+ id: CHART-explore-1508-1
+ meta:
+ chartId: 1508
+ height: 50
+ sliceName: Video Engagement
+ uuid: 6b7610a7-41d0-4d14-be81-62a5a8f22d62
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ - ROW-hKzUoke28
+ 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--qwRXTzHx:
+ children:
+ - CHART-explore-1507-1
+ id: ROW--qwRXTzHx
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ type: ROW
+ ROW-Ixcwhxrj1:
+ children:
+ - CHART-explore-1500-1
+ id: ROW-Ixcwhxrj1
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ type: ROW
+ ROW-RgmR2MvEK:
+ children:
+ - CHART-explore-1502-1
+ id: ROW-RgmR2MvEK
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ type: ROW
+ ROW-XddLr_99f:
+ children:
+ - CHART-explore-1505-1
+ id: ROW-XddLr_99f
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ type: ROW
+ ROW-_txCTpD7V:
+ children:
+ - CHART-explore-1501-1
+ id: ROW-_txCTpD7V
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ type: ROW
+ ROW-bpejHEOdb:
+ children:
+ - CHART-explore-1503-1
+ id: ROW-bpejHEOdb
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ type: ROW
+ ROW-dAYfW3JOym:
+ children:
+ - CHART-explore-1467-1
+ id: ROW-dAYfW3JOym
+ meta:
+ '0': ROOT_ID
+ '1': TABS-6vozRyRn2o
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ type: ROW
+ ROW-dwdD7OF9Z:
+ children:
+ - CHART-explore-1504-1
+ id: ROW-dwdD7OF9Z
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ type: ROW
+ ROW-hgxCVRi9M:
+ children:
+ - CHART-explore-1506-1
+ id: ROW-hgxCVRi9M
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ type: ROW
+ ROW-iMG3T4uBu:
+ children:
+ - CHART-explore-1508-1
+ id: ROW-iMG3T4uBu
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ type: ROW
+ TAB-GuHDMLqRC:
+ children:
+ - ROW-_txCTpD7V
+ - ROW-bpejHEOdb
+ - ROW-XddLr_99f
+ - ROW--qwRXTzHx
+ - ROW-iMG3T4uBu
+ 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-Ixcwhxrj1
+ - ROW-RgmR2MvEK
+ - ROW-dwdD7OF9Z
+ - ROW-hgxCVRi9M
+ - ROW-dAYfW3JOym
+ 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..9ad623f4e
--- /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_XAPI_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' %}