Dict Error in program enrollment tool

App Versions

{
	"education": "15.0.0",
	"erpnext": "15.93.0",
	"frappe": "15.93.0",
	"hrms": "15.54.1"
}

Route

Form/Program Enrollment Tool/Program Enrollment Tool

Traceback

Traceback (most recent call last):
  File "apps/frappe/frappe/app.py", line 120, in application
    response = frappe.api.handle(request)
  File "apps/frappe/frappe/api/__init__.py", line 52, in handle
    data = endpoint(**arguments)
  File "apps/frappe/frappe/api/v1.py", line 40, in handle_rpc_call
    return frappe.handler.handle()
  File "apps/frappe/frappe/handler.py", line 53, in handle
    data = execute_cmd(cmd)
  File "apps/frappe/frappe/handler.py", line 86, in execute_cmd
    return frappe.call(method, **frappe.form_dict)
  File "apps/frappe/frappe/__init__.py", line 1754, in call
    return fn(*args, **newargs)
  File "apps/frappe/frappe/handler.py", line 336, in run_doc_method
    response = doc.run_method(method)
  File "apps/frappe/frappe/model/document.py", line 1011, in run_method
    out = Document.hook(fn)(self, *args, **kwargs)
  File "apps/frappe/frappe/model/document.py", line 1371, in composer
    return composed(self, method, *args, **kwargs)
  File "apps/frappe/frappe/model/document.py", line 1353, in runner
    add_to_return_value(self, fn(self, *args, **kwargs))
  File "apps/frappe/frappe/model/document.py", line 1008, in fn
    return method_object(*args, **kwargs)
  File "apps/frappe/frappe/utils/typing_validations.py", line 32, in wrapper
    return func(*args, **kwargs)
  File "apps/education/education/education/doctype/program_enrollment_tool/program_enrollment_tool.py", line 32, in get_students
    students = frappe.db.sql(
  File "apps/frappe/frappe/database/database.py", line 230, in sql
    self._cursor.execute(query, values)
  File "env/lib/python3.10/site-packages/pymysql/cursors.py", line 151, in execute
    query = self.mogrify(query, args)
  File "env/lib/python3.10/site-packages/pymysql/cursors.py", line 129, in mogrify
    query = query % self._escape_args(args, conn)
  File "env/lib/python3.10/site-packages/pymysql/cursors.py", line 104, in _escape_args
    return {key: conn.literal(val) for (key, val) in args.items()}
  File "env/lib/python3.10/site-packages/pymysql/cursors.py", line 104, in <dictcomp>
    return {key: conn.literal(val) for (key, val) in args.items()}
  File "env/lib/python3.10/site-packages/pymysql/connections.py", line 530, in literal
    return self.escape(obj, self.encoders)
  File "env/lib/python3.10/site-packages/pymysql/connections.py", line 523, in escape
    return converters.escape_item(obj, self.charset, mapping=mapping)
  File "env/lib/python3.10/site-packages/pymysql/converters.py", line 23, in escape_item
    val = encoder(val, charset, mapping)
  File "env/lib/python3.10/site-packages/pymysql/converters.py", line 30, in escape_dict
    raise TypeError("dict can not be used as parameter")
TypeError: dict can not be used as parameter

Request Data

{
	"type": "POST",
	"args": {
		"docs": "{\"name\":\"Program Enrollment Tool\",\"owner\":\"Administrator\",\"modified\":\"2024-10-23 20:41:55.668314\",\"modified_by\":\"Administrator\",\"docstatus\":0,\"idx\":\"0\",\"get_students_from\":\"Student Applicant\",\"doctype\":\"Program Enrollment Tool\",\"students\":[],\"__onload\":{\"academic_term_reqd\":1},\"__last_sync_on\":\"2025-12-29T08:58:51.623Z\",\"__unsaved\":1,\"academic_year\":\"2025\",\"program\":\"GRADE 9\",\"academic_term\":\"2025 (TERM 1)\"}",
		"method": "get_students"
	},
	"headers": {},
	"error_handlers": {},
	"url": "/api/method/run_doc_method",
	"request_id": null
}

Response Data

{
	"exception": "TypeError: dict can not be used as parameter",
	"exc_type": "TypeError",
	"_exc_source": "education (app)"
}

This is happening in Frappe 15 because of stricter typing.
How I resolved this:- removed self.as_dict() passed into SQL

Student applicant query
students = frappe.db.sql(
“”“select name as student_applicant, title as student_name
from tabStudent Applicant
where application_status=“Approved”
and program=%(program)s
and academic_year=%(academic_year)s {0}”“”.format(condition),
{
“program”: self.program,
“academic_year”: self.academic_year,
“academic_term”: self.academic_term,
},
as_dict=1,
)

Program enrollment

students = frappe.db.sql(
“”“select student, student_name, student_batch_name, student_category
from tabProgram Enrollment
where program=%(program)s
and academic_year=%(academic_year)s {0} {1}
and docstatus != 2"”".format(condition, condition2),
{
“program”: self.program,
“academic_year”: self.academic_year,
“academic_term”: self.academic_term,
“student_batch”: self.student_batch,
},
as_dict=1,
)