@@ -501,7 +501,8 @@ def match_appointment_advisors_by_name(prefixes, limit=None):
501501 { ' ' .join (prefix_conditions )}
502502 ORDER BY a.first_name, a.last_name"""
503503 if limit :
504- sql += f' LIMIT { limit } '
504+ sql += ' LIMIT %(limit)s'
505+ prefix_kwargs ['limit' ] = limit
505506 return safe_execute_rds (sql , ** prefix_kwargs )
506507
507508
@@ -520,7 +521,8 @@ def match_advising_note_authors_by_name(prefixes, limit=None):
520521 { ' ' .join (prefix_conditions )}
521522 ORDER BY a.first_name, a.last_name"""
522523 if limit :
523- sql += f' LIMIT { limit } '
524+ sql += ' LIMIT %(limit)s'
525+ prefix_kwargs ['limit' ] = limit
524526 return safe_execute_rds (sql , ** prefix_kwargs )
525527
526528
@@ -692,7 +694,7 @@ def get_admitted_student_by_sid(sid):
692694
693695
694696def get_admitted_students_by_sids (offset , sids , limit = None , order_by = 'last_name' ):
695- limit_clause = f 'LIMIT { limit } ' if limit else ''
697+ limit_clause = 'LIMIT %( limit)s ' if limit else ''
696698 sql = f"""
697699 SELECT a.applyuc_cpid, a.cs_empl_id AS sid, a.uid, s.uid AS student_uid,
698700 a.residency_category, a.freshman_or_transfer, a.admit_term, a.admit_status, a.current_sir, college, a.first_name, a.middle_name,
@@ -1495,7 +1497,7 @@ def get_students_query( # noqa: C901, PLR0912, PLR0913, PLR0915
14951497 query_bindings .update ({'previous_term_id' : previous_term_id (current_term_id )})
14961498 query_filter += _number_ranges_to_sql ('spi.units' , unit_ranges ) if unit_ranges else ''
14971499 if last_name_ranges :
1498- query_filter += _last_name_ranges_to_sql (last_name_ranges )
1500+ query_filter += _last_name_ranges_to_sql (last_name_ranges , query_bindings )
14991501 if degree_terms :
15001502 query_filter += ' AND sd.term_id = ANY(%(degree_terms)s)'
15011503 query_bindings .update ({'degree_terms' : degree_terms })
@@ -1713,10 +1715,11 @@ def get_students_ordering(term_id, order_by=None, group_codes=None, majors=None,
17131715 o = 'set.enrolled_units'
17141716 elif order_by and order_by .startswith ('term_gpa_' ):
17151717 gpa_term_id = order_by .replace ('term_gpa_' , '' )
1716- supplemental_query_tables = f"""
1717- LEFT JOIN { student_schema ()} .student_enrollment_terms set
1718- ON set.sid = spi.sid AND set.term_id = '{ gpa_term_id } '"""
1719- o = 'set.term_gpa'
1718+ if gpa_term_id .isdigit ():
1719+ supplemental_query_tables = f"""
1720+ LEFT JOIN { student_schema ()} .student_enrollment_terms set
1721+ ON set.sid = spi.sid AND set.term_id = '{ gpa_term_id } '"""
1722+ o = 'set.term_gpa'
17201723 o_secondary = by_first_name if order_by == 'last_name' else by_last_name
17211724 diff = {by_first_name , by_last_name } - {o , o_secondary }
17221725 o_tertiary = diff .pop () if diff else 'spi.sid'
@@ -1840,9 +1843,9 @@ def _match_students_by_sid(sid, limit=None):
18401843 SELECT spi.first_name, spi.last_name, spi.email_address, spi.sid, spi.uid
18411844 FROM { student_schema ()} .student_profile_index spi
18421845 WHERE spi.sid LIKE %(starts_with)s
1843- { f' LIMIT { limit } ' if limit else '' }
1846+ { ' LIMIT %( limit)s ' if limit else '' }
18441847 """
1845- return safe_execute_rds (sql , ** {'starts_with' : f'{ sid } %' })
1848+ return safe_execute_rds (sql , ** {'starts_with' : f'{ sid } %' , 'limit' : limit })
18461849
18471850
18481851def _match_students_by_name_or_email (phrase , limit = None , prefix_only = False ):
@@ -1864,12 +1867,13 @@ def _match_students_by_name_or_email(phrase, limit=None, prefix_only=False):
18641867 ELSE 2
18651868 END
18661869 ), s.first_name, s.last_name
1867- { f 'LIMIT { limit } ' if limit else '' }
1870+ { 'LIMIT %( limit)s ' if limit else '' }
18681871 ) AS s
18691872 """
18701873 return safe_execute_rds (sql , ** {
18711874 'contains' : f'%{ phrase } %' ,
18721875 'starts_with' : f'{ phrase } %' ,
1876+ 'limit' : limit ,
18731877 })
18741878
18751879
@@ -1918,8 +1922,9 @@ def _search_for_students(phrases, limit=None, prefix_only=False):
19181922 ELSE 2
19191923 END
19201924 ), s.first_name, s.last_name
1921- { f' LIMIT { limit } ' if limit else '' }
1925+ { ' LIMIT %( limit)s ' if limit else '' }
19221926 """
1927+ sql_params ['limit' ] = limit
19231928 return safe_execute_rds (sql , ** sql_params )
19241929
19251930
@@ -1965,21 +1970,28 @@ def _number_ranges_to_sql(column, number_ranges):
19651970 return ''
19661971
19671972
1968- def _last_name_ranges_to_sql (last_name_ranges ):
1973+ def _last_name_ranges_to_sql (last_name_ranges , query_bindings ):
19691974 query_filter = ''
19701975 count = len (last_name_ranges )
19711976 if count :
19721977 query_filter += ' AND ('
19731978 for idx , last_name_range in enumerate (last_name_ranges ):
19741979 range_min = last_name_range ['min' ].upper ()
19751980 range_max = last_name_range ['max' ].upper ()
1981+ min_key = f'last_name_min_{ idx } '
1982+ max_key = f'last_name_max_{ idx } '
19761983 if range_max == range_min :
1977- query_filter += f'(spi.last_name ILIKE \' { range_min } %%\' )'
1984+ query_filter += f'(spi.last_name ILIKE %({ min_key } )s)'
1985+ query_bindings [min_key ] = f'{ range_min } %'
19781986 else :
1979- query_filter += f'(UPPER(SUBSTRING(spi.last_name, 0, { len (range_min ) + 1 } )) >= \' { range_min } \' '
1987+ query_filter += f'(UPPER(SUBSTRING(spi.last_name, 0, %({ min_key } _len)s)) >= %({ min_key } )s'
1988+ query_bindings [min_key ] = range_min
1989+ query_bindings [f'{ min_key } _len' ] = len (range_min ) + 1
19801990 if range_max < 'ZZ' :
19811991 # If 'stop' were 'ZZ' then upper bound would not be necessary
1982- query_filter += f' AND UPPER(SUBSTRING(spi.last_name, 0, { len (range_max ) + 1 } )) <= \' { range_max } \' '
1992+ query_filter += f' AND UPPER(SUBSTRING(spi.last_name, 0, %({ max_key } _len)s)) <= %({ max_key } )s'
1993+ query_bindings [max_key ] = range_max
1994+ query_bindings [f'{ max_key } _len' ] = len (range_max ) + 1
19831995 query_filter += ')'
19841996 if idx < count - 1 :
19851997 query_filter += ' OR '
0 commit comments