2323# see http://www.gnu.org/licenses/.
2424#
2525##############################################################################
26- from django .db .models import OuterRef , Subquery
26+ from django .contrib .postgres .aggregates import StringAgg
27+ from django .db .models import OuterRef , Subquery , F , Value
28+ from django .db .models .functions import Concat , Upper
2729from django .utils .translation import gettext_lazy as _
2830from openpyxl import Workbook
2931from openpyxl .styles import Font
3032
3133from internship import models
3234from internship .models .enums import organization_report_fields
35+ from internship .models .enums .role import Role
3336from internship .models .internship_student_information import InternshipStudentInformation
3437from internship .models .master_allocation import MasterAllocation
3538from internship .utils .exporting .spreadsheet import columns_resizing , add_row
@@ -69,14 +72,22 @@ def _add_students(worksheet, cohort, organization):
6972 cohort , organization
7073 ).select_related ('student__person' )
7174
72- master_allocation_subquery = MasterAllocation .objects .filter (
75+ master_names = MasterAllocation .objects .filter (
7376 organization_id = OuterRef ('organization_id' ),
74- specialty_id = OuterRef ('speciality_id' )
75- )
77+ specialty_id = OuterRef ('speciality_id' ),
78+ role = Role .MASTER .name ,
79+ ).annotate (
80+ full_name = Concat (
81+ Upper (F ('master__person__last_name' )),
82+ Value (' ' ),
83+ F ('master__person__first_name' )
84+ )
85+ ).values ('organization_id' ).annotate (
86+ all_names = StringAgg ('full_name' , delimiter = ', ' )
87+ ).values ('all_names' )
7688
7789 students_stat = students_stat .annotate (
78- master_last_name = Subquery (master_allocation_subquery .values ('master__person__last_name' )[:1 ]),
79- master_first_name = Subquery (master_allocation_subquery .values ('master__person__first_name' )[:1 ])
90+ masters = Subquery (master_names [:1 ])
8091 )
8192
8293 rep_seq = list (organization .report_sequence ())
@@ -98,8 +109,7 @@ def _add_students(worksheet, cohort, organization):
98109 organization_report_fields .LAST_NAME : student_info .person .last_name ,
99110 organization_report_fields .FIRST_NAME : student_info .person .first_name ,
100111 organization_report_fields .SPECIALTY : student_stat .speciality .name ,
101- organization_report_fields .MASTER :
102- f"{ student_stat .master_first_name [0 ].upper ()} . { student_stat .master_last_name .upper ()} " ,
112+ organization_report_fields .MASTER : student_stat .masters ,
103113 organization_report_fields .BIRTHDATE : student_info .person .birth_date .strftime ("%d-%m-%Y" )
104114 if student_info .person .birth_date else None ,
105115 organization_report_fields .EMAIL : student_info .person .email ,
0 commit comments