diff --git a/tutoraspects/plugin.py b/tutoraspects/plugin.py
index d3668f492..5da88b25e 100644
--- a/tutoraspects/plugin.py
+++ b/tutoraspects/plugin.py
@@ -375,8 +375,8 @@
# DBT_PROFILE_* settings get passed into the dbt_profile.yml file.
# 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_REPOSITORY", "https://github.com/saraburns1/aspects-dbt"),
+ ("DBT_BRANCH", "coursecompare"),
("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..4dae7be9a
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_a433e3.yaml
@@ -0,0 +1,132 @@
+_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: []
+ 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..80fd76a7b
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Course_Info_e0098c.yaml
@@ -0,0 +1,224 @@
+_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: []
+ 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:
+ - aggregate: COUNT_DISTINCT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7901
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Current Enrollees
+ optionName: metric_j4kvubgy7m_afs23ho378e
+ sqlExpression: null
+ - 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:
+ 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:
+ - aggregate: COUNT_DISTINCT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7901
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Current Enrollees
+ optionName: metric_j4kvubgy7m_afs23ho378e
+ sqlExpression: null
+ - 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: 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:
+ - aggregate: COUNT_DISTINCT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7901
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Current Enrollees
+ optionName: metric_j4kvubgy7m_afs23ho378e
+ sqlExpression: null
+ - active_count
+ - tag_list
+ order_desc: false
+ orderby:
+ - - aggregate: COUNT_DISTINCT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7901
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Current Enrollees
+ optionName: metric_j4kvubgy7m_afs23ho378e
+ sqlExpression: null
+ - 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..ce00a9f8b
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_2f2af8.yaml
@@ -0,0 +1,195 @@
+_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
+ colOrder: key_a_to_z
+ colSubTotals: false
+ conditional_formatting: []
+ date_format: smart_date
+ extra_form_data: {}
+ groupbyColumns:
+ - enrollment_mode
+ groupbyRows:
+ - course_name
+ metrics:
+ - aggregate: COUNT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7758
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Enrollee Count
+ optionName: metric_s19whrov34m_h70zr1gflp4
+ sqlExpression: null
+ 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:
+ - aggregate: COUNT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7758
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Enrollee Count
+ optionName: metric_s19whrov34m_h70zr1gflp4
+ sqlExpression: null
+ 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:
+ - aggregate: COUNT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7758
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Enrollee Count
+ optionName: metric_s19whrov34m_h70zr1gflp4
+ sqlExpression: null
+ order_desc: true
+ orderby:
+ - - aggregate: COUNT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7758
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Enrollee Count
+ optionName: metric_s19whrov34m_h70zr1gflp4
+ sqlExpression: null
+ - 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..5f04d9b26
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Enrollment_Counts_bd37be.yaml
@@ -0,0 +1,195 @@
+_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
+ colOrder: key_a_to_z
+ colSubTotals: false
+ conditional_formatting: []
+ date_format: smart_date
+ extra_form_data: {}
+ groupbyColumns:
+ - enrollment_mode
+ groupbyRows:
+ - course_run
+ metrics:
+ - aggregate: COUNT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7758
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Enrollee Count
+ optionName: metric_s19whrov34m_h70zr1gflp4
+ sqlExpression: null
+ 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:
+ - aggregate: COUNT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7758
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Enrollee Count
+ optionName: metric_s19whrov34m_h70zr1gflp4
+ sqlExpression: null
+ 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:
+ - aggregate: COUNT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7758
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Enrollee Count
+ optionName: metric_s19whrov34m_h70zr1gflp4
+ sqlExpression: null
+ order_desc: false
+ orderby:
+ - - aggregate: COUNT
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: actor_id
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7758
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: String
+ type_generic: 1
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Enrollee Count
+ optionName: metric_s19whrov34m_h70zr1gflp4
+ sqlExpression: null
+ - 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..4183a273c
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_4e48b8.yaml
@@ -0,0 +1,122 @@
+_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
+ 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..adbc9e23d
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Learner_Performance_dde44a.yaml
@@ -0,0 +1,145 @@
+_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
+ 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_e05c6b.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_e05c6b.yaml
new file mode 100644
index 000000000..f55c40876
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_e05c6b.yaml
@@ -0,0 +1,416 @@
+_file_name: Video_Engagement_e05c6b.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:
+ '% Video Seconds Re-Watched':
+ d3NumberFormat: ',.1%'
+ '% Video Seconds Watched':
+ d3NumberFormat: ',.1%'
+ conditional_formatting: []
+ extra_form_data: {}
+ groupby:
+ - course_name
+ metrics:
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T18:28:32'
+ column_name: watched_percent
+ created_on: '2024-08-28T18:28:32'
+ description: null
+ expression: case when rewatched = 0 then watched_duration else 0 end/video_duration
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7800
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: null
+ type_generic: null
+ uuid: 312f07df-6697-449a-8abb-34d72a237075
+ verbose_name: '% Video Seconds Watched'
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: '% Video Seconds Watched'
+ optionName: metric_r99cysqsd4_7y7sodnz76x
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T18:28:32'
+ column_name: rewatched_percent
+ created_on: '2024-08-28T18:28:32'
+ description: null
+ expression: case when rewatched = 1 then watched_duration else 0 end/video_duration
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7799
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: null
+ type_generic: null
+ uuid: 1514b517-9eb6-4e69-957c-7bf3c79a83b8
+ verbose_name: '% Video Seconds Re-Watched'
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: '% Video Seconds Re-Watched'
+ optionName: metric_l9dkjvflsqq_fxiymsitu7e
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T15:22:03'
+ column_name: count_videos
+ created_on: '2024-08-28T15:22:03'
+ description: null
+ expression: null
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7780
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: UInt64
+ type_generic: 0
+ uuid: aefe5690-0f64-4c48-b38f-18c2a88abeb0
+ verbose_name: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Number of Videos
+ optionName: metric_hjye74a0is8_yc6bswefuxl
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T15:22:03'
+ column_name: avg_video_length
+ created_on: '2024-08-28T15:22:03'
+ description: null
+ expression: null
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7778
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: Float64
+ type_generic: 0
+ uuid: d1bff67f-2ce1-421e-be5e-b5a9ac5e5b68
+ verbose_name: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Avg Video Length (seconds)
+ optionName: metric_svqegmzro_bmnugdrle86
+ sqlExpression: null
+ 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: 647
+ type: table
+ force: false
+ form_data:
+ adhoc_filters: []
+ all_columns: []
+ color_pn: true
+ column_config:
+ '% Video Seconds Re-Watched':
+ d3NumberFormat: ',.1%'
+ '% Video Seconds Watched':
+ d3NumberFormat: ',.1%'
+ conditional_formatting: []
+ dashboards:
+ - 161
+ datasource: 647__table
+ extra_form_data: {}
+ force: false
+ groupby:
+ - course_name
+ metrics:
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T18:28:32'
+ column_name: watched_percent
+ created_on: '2024-08-28T18:28:32'
+ description: null
+ expression: case when rewatched = 0 then watched_duration else 0 end/video_duration
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7800
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: null
+ type_generic: null
+ uuid: 312f07df-6697-449a-8abb-34d72a237075
+ verbose_name: '% Video Seconds Watched'
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: '% Video Seconds Watched'
+ optionName: metric_r99cysqsd4_7y7sodnz76x
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T18:28:32'
+ column_name: rewatched_percent
+ created_on: '2024-08-28T18:28:32'
+ description: null
+ expression: case when rewatched = 1 then watched_duration else 0 end/video_duration
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7799
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: null
+ type_generic: null
+ uuid: 1514b517-9eb6-4e69-957c-7bf3c79a83b8
+ verbose_name: '% Video Seconds Re-Watched'
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: '% Video Seconds Re-Watched'
+ optionName: metric_l9dkjvflsqq_fxiymsitu7e
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T15:22:03'
+ column_name: count_videos
+ created_on: '2024-08-28T15:22:03'
+ description: null
+ expression: null
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7780
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: UInt64
+ type_generic: 0
+ uuid: aefe5690-0f64-4c48-b38f-18c2a88abeb0
+ verbose_name: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Number of Videos
+ optionName: metric_hjye74a0is8_yc6bswefuxl
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T15:22:03'
+ column_name: avg_video_length
+ created_on: '2024-08-28T15:22:03'
+ description: null
+ expression: null
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7778
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: Float64
+ type_generic: 0
+ uuid: d1bff67f-2ce1-421e-be5e-b5a9ac5e5b68
+ verbose_name: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Avg Video Length (seconds)
+ optionName: metric_svqegmzro_bmnugdrle86
+ sqlExpression: null
+ 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: 1277
+ table_timestamp_format: smart_date
+ temporal_columns_lookup: {}
+ viz_type: table
+ queries:
+ - annotation_layers: []
+ applied_time_extras: {}
+ columns:
+ - course_name
+ custom_form_data: {}
+ custom_params: {}
+ extras:
+ having: ''
+ where: ''
+ filters: []
+ metrics:
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T18:28:32'
+ column_name: watched_percent
+ created_on: '2024-08-28T18:28:32'
+ description: null
+ expression: case when rewatched = 0 then watched_duration else 0 end/video_duration
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7800
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: null
+ type_generic: null
+ uuid: 312f07df-6697-449a-8abb-34d72a237075
+ verbose_name: '% Video Seconds Watched'
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: '% Video Seconds Watched'
+ optionName: metric_r99cysqsd4_7y7sodnz76x
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T18:28:32'
+ column_name: rewatched_percent
+ created_on: '2024-08-28T18:28:32'
+ description: null
+ expression: case when rewatched = 1 then watched_duration else 0 end/video_duration
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7799
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: null
+ type_generic: null
+ uuid: 1514b517-9eb6-4e69-957c-7bf3c79a83b8
+ verbose_name: '% Video Seconds Re-Watched'
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: '% Video Seconds Re-Watched'
+ optionName: metric_l9dkjvflsqq_fxiymsitu7e
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T15:22:03'
+ column_name: count_videos
+ created_on: '2024-08-28T15:22:03'
+ description: null
+ expression: null
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7780
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: UInt64
+ type_generic: 0
+ uuid: aefe5690-0f64-4c48-b38f-18c2a88abeb0
+ verbose_name: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Number of Videos
+ optionName: metric_hjye74a0is8_yc6bswefuxl
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T15:22:03'
+ column_name: avg_video_length
+ created_on: '2024-08-28T15:22:03'
+ description: null
+ expression: null
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7778
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: Float64
+ type_generic: 0
+ uuid: d1bff67f-2ce1-421e-be5e-b5a9ac5e5b68
+ verbose_name: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Avg Video Length (seconds)
+ optionName: metric_svqegmzro_bmnugdrle86
+ sqlExpression: null
+ order_desc: true
+ orderby:
+ - - aggregate: AVG
+ column:
+ advanced_data_type: null
+ changed_on: '2024-08-28T18:28:32'
+ column_name: watched_percent
+ created_on: '2024-08-28T18:28:32'
+ description: null
+ expression: case when rewatched = 0 then watched_duration else 0 end/video_duration
+ extra: '{}'
+ filterable: true
+ groupby: true
+ id: 7800
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: null
+ type_generic: null
+ uuid: 312f07df-6697-449a-8abb-34d72a237075
+ verbose_name: '% Video Seconds Watched'
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: '% Video Seconds Watched'
+ optionName: metric_r99cysqsd4_7y7sodnz76x
+ sqlExpression: null
+ - false
+ post_processing: []
+ row_limit: 50000
+ series_limit: 0
+ url_params: {}
+ result_format: json
+ result_type: full
+slice_name: Video Engagement
+uuid: e05c6b26-c048-4c98-b91e-d904d754adde
+version: 1.0.0
+viz_type: table
diff --git a/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_e26ecc.yaml b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_e26ecc.yaml
new file mode 100644
index 000000000..499aba6e6
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/charts/Video_Engagement_e26ecc.yaml
@@ -0,0 +1,140 @@
+_file_name: Video_Engagement_e26ecc.yaml
+cache_timeout: null
+certification_details: null
+certified_by: null
+dataset_uuid: 82cb6b56-c713-4933-93a0-9de15c266c4b
+description: null
+params:
+ adhoc_filters:
+ - clause: WHERE
+ comparator: No filter
+ expressionType: SIMPLE
+ operator: TEMPORAL_RANGE
+ subject: started_at
+ all_columns: []
+ annotation_layers: []
+ color_pn: true
+ column_config:
+ '% Video Seconds Re-Watched':
+ d3NumberFormat: ',.1%'
+ '% Video Seconds Watched':
+ d3NumberFormat: ',.1%'
+ Avg Video Length:
+ d3NumberFormat: SMART_NUMBER
+ conditional_formatting: []
+ extra_form_data: {}
+ groupby:
+ - course_run
+ - course_name
+ metrics:
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: watched_percent
+ description: null
+ expression: case when rewatched = 0 then watched_duration else 0 end/video_duration
+ filterable: true
+ groupby: true
+ id: 7800
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: null
+ type_generic: null
+ verbose_name: '% Video Seconds Watched'
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: '% Video Seconds Watched'
+ optionName: metric_zaptr05wu3_gxjyutcn88p
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: rewatched_percent
+ description: null
+ expression: case when rewatched = 1 then watched_duration else 0 end/video_duration
+ filterable: true
+ groupby: true
+ id: 7799
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: null
+ type_generic: null
+ verbose_name: '% Video Seconds Re-Watched'
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: '% Video Seconds Re-Watched'
+ optionName: metric_zzvs0afhkk_wgh07ya9p7g
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: count_videos
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7780
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: UInt64
+ type_generic: 0
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Number of Videos
+ optionName: metric_hjye74a0is8_yc6bswefuxl
+ sqlExpression: null
+ - aggregate: AVG
+ column:
+ advanced_data_type: null
+ certification_details: null
+ certified_by: null
+ column_name: avg_video_length
+ description: null
+ expression: null
+ filterable: true
+ groupby: true
+ id: 7778
+ is_certified: false
+ is_dttm: false
+ python_date_format: null
+ type: Float64
+ type_generic: 0
+ verbose_name: null
+ warning_markdown: null
+ datasourceWarning: false
+ expressionType: SIMPLE
+ hasCustomLabel: true
+ label: Avg Video Length (seconds)
+ optionName: metric_svqegmzro_bmnugdrle86
+ sqlExpression: null
+ 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: null
+slice_name: Video Engagement
+uuid: e26ecce9-32cf-4ac5-8706-14dd9f8e0e42
+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..6aa6943f3
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/dashboards/Course_Comparison_Dashboard.yaml
@@ -0,0 +1,670 @@
+_file_name: Course_Comparison_Dashboard.yaml
+_roles:
+- '{{ SUPERSET_ROLES_MAPPING.instructor }}'
+certification_details: null
+certified_by: null
+css: ''
+dashboard_title: Course Comparison Dashboard
+description: null
+metadata:
+ chart_configuration:
+ '1273':
+ crossFilters:
+ chartsInScope:
+ - 1274
+ - 1275
+ - 1276
+ - 1277
+ - 1278
+ - 1279
+ - 1292
+ - 1294
+ - 1295
+ scope: global
+ id: 1273
+ '1274':
+ crossFilters:
+ chartsInScope:
+ - 1273
+ - 1275
+ - 1276
+ - 1277
+ - 1278
+ - 1279
+ - 1292
+ - 1294
+ - 1295
+ scope: global
+ id: 1274
+ '1275':
+ crossFilters:
+ chartsInScope:
+ - 1273
+ - 1274
+ - 1276
+ - 1277
+ - 1278
+ - 1279
+ - 1292
+ - 1294
+ - 1295
+ scope: global
+ id: 1275
+ '1276':
+ crossFilters:
+ chartsInScope:
+ - 1273
+ - 1274
+ - 1275
+ - 1277
+ - 1278
+ - 1279
+ - 1292
+ - 1294
+ - 1295
+ scope: global
+ id: 1276
+ '1277':
+ crossFilters:
+ chartsInScope:
+ - 1273
+ - 1274
+ - 1275
+ - 1276
+ - 1278
+ - 1279
+ - 1292
+ - 1294
+ - 1295
+ scope: global
+ id: 1277
+ '1278':
+ crossFilters:
+ chartsInScope:
+ - 1273
+ - 1274
+ - 1275
+ - 1276
+ - 1277
+ - 1279
+ - 1292
+ - 1294
+ - 1295
+ scope: global
+ id: 1278
+ '1279':
+ crossFilters:
+ chartsInScope:
+ - 1273
+ - 1274
+ - 1275
+ - 1276
+ - 1277
+ - 1278
+ - 1292
+ - 1294
+ - 1295
+ scope: global
+ id: 1279
+ '1292':
+ crossFilters:
+ chartsInScope:
+ - 1273
+ - 1274
+ - 1275
+ - 1276
+ - 1277
+ - 1278
+ - 1279
+ - 1294
+ - 1295
+ scope: global
+ id: 1292
+ '1294':
+ crossFilters:
+ chartsInScope: []
+ scope:
+ excluded:
+ - 1294
+ rootPath: []
+ id: 1294
+ '1295':
+ crossFilters:
+ chartsInScope:
+ - 1273
+ - 1274
+ - 1275
+ - 1276
+ - 1277
+ - 1278
+ - 1279
+ - 1292
+ - 1294
+ scope: global
+ id: 1295
+ 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:
+ '1275': true
+ '1276': true
+ '1279': true
+ '1292': true
+ global_chart_configuration:
+ chartsInScope:
+ - 1273
+ - 1274
+ - 1275
+ - 1276
+ - 1277
+ - 1278
+ - 1279
+ - 1292
+ - 1294
+ - 1295
+ 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:
+ - 1273
+ - 1274
+ - 1275
+ - 1276
+ - 1277
+ - 1278
+ - 1279
+ - 1292
+ 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:
+ - TAB-J31MdXj-sa
+ - TAB-GuHDMLqRC
+ 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: {}
+ timed_refresh_immune_slices: []
+position:
+ CHART-explore-1273-1:
+ children: []
+ id: CHART-explore-1273-1
+ meta:
+ chartId: 1273
+ 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: 1274
+ 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: 1275
+ 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: 1276
+ 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-1277-1:
+ children: []
+ id: CHART-explore-1277-1
+ meta:
+ chartId: 1277
+ height: 50
+ sliceName: Video Engagement
+ uuid: e05c6b26-c048-4c98-b91e-d904d754adde
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-J31MdXj-sa
+ - ROW-eosCHWz8o
+ type: CHART
+ CHART-explore-1278-1:
+ children: []
+ id: CHART-explore-1278-1
+ meta:
+ chartId: 1278
+ height: 50
+ sliceName: Video Engagement
+ uuid: e26ecce9-32cf-4ac5-8706-14dd9f8e0e42
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ - ROW-7fC-nHawN
+ type: CHART
+ CHART-explore-1279-1:
+ children: []
+ id: CHART-explore-1279-1
+ meta:
+ chartId: 1279
+ 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: 1292
+ 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: 1294
+ height: 49
+ sliceName: Enrollment Count
+ 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: 1295
+ height: 49
+ sliceName: Enrollment Count
+ uuid: bd37be7f-6672-4dca-80ae-a54f69d169da
+ width: 12
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ - ROW-17CIe_GHN
+ 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-7fC-nHawN:
+ children:
+ - CHART-explore-1278-1
+ id: ROW-7fC-nHawN
+ 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-O1XuzgpIo:
+ children:
+ - CHART-explore-1276-1
+ id: ROW-O1XuzgpIo
+ meta:
+ background: BACKGROUND_TRANSPARENT
+ parents:
+ - ROOT_ID
+ - TABS-6vozRyRn2o
+ - TAB-GuHDMLqRC
+ type: ROW
+ ROW-eosCHWz8o:
+ children:
+ - CHART-explore-1277-1
+ id: ROW-eosCHWz8o
+ meta:
+ 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-7fC-nHawN
+ 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-eosCHWz8o
+ 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..5f1a1e9b7
--- /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: 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: 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: 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: 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_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
+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..4b5f927a2
--- /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: 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: 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: 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..e465715a0
--- /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: 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: 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: 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: 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
+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..5c0cab113
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/tag_filter.yaml
@@ -0,0 +1,78 @@
+_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: null
+ 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: null
+ 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: null
+ 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:
+ warning_markdown: ''
+ metric_name: count
+ metric_type: count
+ verbose_name: COUNT(*)
+ warning_text: null
+- currency: null
+ d3format: null
+ description: null
+ expression: min(rownum)
+ extra:
+ warning_markdown: ''
+ 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..36031c4cb
--- /dev/null
+++ b/tutoraspects/templates/aspects/build/aspects-superset/openedx-assets/assets/datasets/watched_video_duration.yaml
@@ -0,0 +1,182 @@
+_file_name: watched_video_duration.yaml
+always_filter_main_dttm: false
+cache_timeout: null
+columns:
+- advanced_data_type: null
+ column_name: rewatched_percent
+ description: null
+ expression: case when rewatched = 1 then watched_duration else 0 end/video_duration
+ extra: {}
+ filterable: true
+ groupby: true
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: null
+ verbose_name: '% Video Seconds Re-Watched'
+- advanced_data_type: null
+ column_name: watched_percent
+ description: null
+ expression: case when rewatched = 0 then watched_duration else 0 end/video_duration
+ extra: {}
+ filterable: true
+ groupby: true
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: null
+ verbose_name: '% Video Seconds Watched'
+- advanced_data_type: null
+ column_name: course_name
+ description: null
+ expression: ''
+ extra: {}
+ 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: {}
+ 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: {}
+ 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: avg_video_length
+ description: null
+ expression: null
+ extra: {}
+ filterable: true
+ groupby: true
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: Float64
+ verbose_name: Avg Video Length
+- advanced_data_type: null
+ column_name: count_videos
+ description: null
+ expression: null
+ extra: {}
+ filterable: true
+ groupby: true
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: UInt64
+ verbose_name: Count Videos
+- advanced_data_type: null
+ column_name: watched_duration
+ description: null
+ expression: null
+ extra: {}
+ filterable: true
+ groupby: true
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: Int64
+ verbose_name: Watched Duration
+- advanced_data_type: null
+ column_name: video_duration
+ description: null
+ expression: null
+ extra: {}
+ 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: rewatched
+ description: null
+ expression: null
+ extra: {}
+ filterable: true
+ groupby: true
+ is_active: true
+ is_dttm: false
+ python_date_format: null
+ type: UInt8
+ verbose_name: Rewatched
+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(*) - count(distinct actor_id)
+ extra:
+ warning_markdown: ''
+ metric_name: repeat_views
+ metric_type: null
+ verbose_name: Repeat Views
+ warning_text: null
+- currency: null
+ d3format: null
+ description: null
+ expression: count(distinct actor_id)
+ extra:
+ warning_markdown: ''
+ metric_name: unique_viewers
+ metric_type: null
+ verbose_name: Unique Viewers
+ warning_text: null
+- currency: null
+ d3format: null
+ description: null
+ expression: count(*)
+ extra:
+ warning_markdown: ''
+ metric_name: total_views
+ metric_type: null
+ verbose_name: Total Views
+ 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..e9676ff48 100644
--- a/tutoraspects/templates/openedx-assets/queries/common_filters.sql
+++ b/tutoraspects/templates/openedx-assets/queries/common_filters.sql
@@ -11,3 +11,14 @@
)
{% endif %}
{%- endraw %}
+
+{% raw -%}
+{% if filter_values("tag") != [] %}
+ and course_key in (
+ select course_key
+ from {{ DBT_PROFILE_TARGET_DATABASE }}.course_tags a
+ 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..410361ecf
--- /dev/null
+++ b/tutoraspects/templates/openedx-assets/queries/course_information.sql
@@ -0,0 +1,24 @@
+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
+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..82d5a8a28
--- /dev/null
+++ b/tutoraspects/templates/openedx-assets/queries/learner_performance_breakdown.sql
@@ -0,0 +1,14 @@
+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
+from {{ DBT_PROFILE_TARGET_DATABASE }}.fact_student_status
+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..6b90e645d
--- /dev/null
+++ b/tutoraspects/templates/openedx-assets/queries/tag_filter_dataset.sql
@@ -0,0 +1,9 @@
+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
\ No newline at end of file
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..2c858fb91
--- /dev/null
+++ b/tutoraspects/templates/openedx-assets/queries/watched_video_duration.sql
@@ -0,0 +1,88 @@
+with
+ video_events as (
+ select *, splitByString('/xblock/', object_id)[-1] as video_id
+ from xapi.video_playback_events
+ ),
+ totals as (
+ select
+ org,
+ course_key,
+ count(distinct video_id) as count_videos,
+ avg(video_duration) as avg_video_length
+ from video_events
+ group by org, course_key
+ ),
+ starts as (
+ select
+ org,
+ course_key,
+ actor_id,
+ emission_time,
+ cast(video_position as Int32) as start_position,
+ video_id,
+ video_duration
+ from video_events
+ where verb_id = 'https://w3id.org/xapi/video/verbs/played'
+ ),
+ ends as (
+ select
+ org,
+ course_key,
+ actor_id,
+ emission_time,
+ cast(video_position as Int32) as end_position,
+ video_id
+ from video_events
+ where
+ verb_id in (
+ 'http://adlnet.gov/expapi/verbs/completed',
+ 'https://w3id.org/xapi/video/verbs/seeked',
+ 'https://w3id.org/xapi/video/verbs/paused',
+ 'http://adlnet.gov/expapi/verbs/terminated'
+ )
+ ),
+ rewatches as (
+ select org, course_key, video_id, actor_id, start_position
+ from starts
+ group by org, course_key, video_id, actor_id, start_position
+ having count(1) > 1
+ ),
+ duration as (
+ select
+ starts.org as org,
+ starts.course_key as course_key,
+ starts.actor_id as actor_id,
+ video_duration,
+ starts.start_position - end_position as watched_duration,
+ case when rewatches.org <> '' then 1 else 0 end as rewatched
+ from starts left
+ asof join
+ ends
+ on starts.org = ends.org
+ and starts.course_key = ends.course_key
+ and starts.video_id = ends.video_id
+ and starts.actor_id = ends.actor_id
+ and starts.emission_time < ends.emission_time
+ left join
+ rewatches
+ on rewatches.org = starts.org
+ and rewatches.course_key = starts.course_key
+ and rewatches.actor_id = starts.actor_id
+ and rewatches.start_position = starts.start_position
+ and rewatches.video_id = starts.video_id
+ )
+select
+ totals.org,
+ names.course_name as course_name,
+ names.course_run as course_run,
+ count_videos,
+ avg_video_length,
+ video_duration,
+ watched_duration,
+ rewatched
+from duration
+left join totals
+using org, course_key
+left join event_sink.course_names as names
+using org, course_key
+where 1 = 1 {% include 'openedx-assets/queries/common_filters.sql' %}