diff --git a/frontend/src/pages/ProgrammingExercises/ProgrammingExerciseForm.vue b/frontend/src/pages/ProgrammingExercises/ProgrammingExerciseForm.vue index 2a40361d..817fdc4a 100644 --- a/frontend/src/pages/ProgrammingExercises/ProgrammingExerciseForm.vue +++ b/frontend/src/pages/ProgrammingExercises/ProgrammingExerciseForm.vue @@ -25,7 +25,7 @@ :required="true" /> { @@ -200,6 +198,13 @@ const validateTitle = () => { } const saveExercise = (close: () => void) => { + exercise.value.test_cases = testCases.data.map( + (tc: TestCase, index: number) => ({ + input: tc.input, + expected_output: tc.expected_output, + idx: index + 1, + }) + ) validateTitle() if (props.exerciseID == 'new') createNewExercise(close) else updateExercise(close) diff --git a/lms/lms/utils.py b/lms/lms/utils.py index e8399459..3d404b6e 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -8,6 +8,7 @@ from frappe import _ from frappe.desk.doctype.dashboard_chart.dashboard_chart import get_result from frappe.desk.doctype.notification_log.notification_log import make_notification_logs from frappe.desk.notifications import extract_mentions +from frappe.pulse.utils import get_frappe_version from frappe.rate_limiter import rate_limit from frappe.utils import ( add_months, @@ -526,38 +527,17 @@ def get_lesson_count(course): @rate_limit(limit=500, seconds=60 * 60) def get_chart_data( chart_name, - timespan="Select Date Range", timegrain="Daily", from_date=None, to_date=None, ): - if not from_date: - from_date = add_months(getdate(), -1) - if not to_date: - to_date = getdate() - - from_date = get_datetime(from_date).strftime("%Y-%m-%d") - to_date = get_datetime(to_date) - + from_date, to_date = get_chart_date_range(from_date, to_date) chart = frappe.get_doc("Dashboard Chart", chart_name) doctype = chart.document_type datefield = chart.based_on value_field = chart.value_based_on or "1" - filters = [([chart.document_type, "docstatus", "<", 2])] - filters = filters + json.loads(chart.filters_json) - filters.append([doctype, datefield, ">=", from_date]) - filters.append([doctype, datefield, "<=", to_date]) - - data = frappe.db.get_all( - doctype, - fields=[datefield, {"SUM": value_field}, {"COUNT": "*"}], - filters=filters, - group_by=datefield, - order_by=datefield, - as_list=True, - ) - + data = get_chart_details(doctype, datefield, value_field, chart, from_date, to_date) result = get_result(data, timegrain, from_date, to_date, chart.chart_type) data = [] for row in result: @@ -570,6 +550,56 @@ def get_chart_data( return data +def get_chart_date_range(from_date, to_date): + if not from_date: + from_date = add_months(getdate(), -1) + if not to_date: + to_date = getdate() + + from_date = get_datetime(from_date).strftime("%Y-%m-%d") + to_date = get_datetime(to_date) + + return from_date, to_date + + +def get_chart_filters(doctype, chart, datefield, from_date, to_date): + version = get_frappe_version() + if version.startswith("16."): + filters = [([chart.document_type, "docstatus", "<", 2])] + filters = filters + json.loads(chart.filters_json) + filters.append([doctype, datefield, ">=", from_date]) + filters.append([doctype, datefield, "<=", to_date]) + else: + filters = [([chart.document_type, "docstatus", "<", 2, False])] + filters = filters + json.loads(chart.filters_json) + filters.append([doctype, datefield, ">=", from_date, False]) + filters.append([doctype, datefield, "<=", to_date, False]) + return filters + + +def get_chart_details(doctype, datefield, value_field, chart, from_date, to_date): + filters = get_chart_filters(doctype, chart, datefield, from_date, to_date) + version = get_frappe_version() + if version.startswith("16."): + return frappe.db.get_all( + doctype, + fields=[datefield, {"SUM": value_field}, {"COUNT": "*"}], + filters=filters, + group_by=datefield, + order_by=datefield, + as_list=True, + ) + else: + return frappe.db.get_all( + doctype, + fields=[f"{datefield} as _unit", f"SUM({value_field})", "COUNT(*)"], + filters=filters, + group_by="_unit", + order_by="_unit asc", + as_list=True, + ) + + @frappe.whitelist(allow_guest=True) @rate_limit(limit=500, seconds=60 * 60) def get_course_completion_data():