Changeset 2654 for WAeUP_SRP/base/Students.py
- Timestamp:
- 14 Nov 2007, 17:54:25 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
WAeUP_SRP/base/Students.py
r2640 r2654 116 116 security = ClassSecurityInfo() 117 117 118 security.declareProtected(ModifyPortalContent,"loadPumeResultsFromCSV")###(119 def loadPumeResultsFromCSV(self):120 """load Fulltime Studentdata from CSV values into pumeresults catalog"""121 import transaction122 import random123 ## csv_d = {'jamb_reg_no': "RegNumber", ###(124 ## 'status': "Admission Status",125 ## 'name': "Name",126 ## 'score': "Score",127 ## 'sex': "Sex",128 ## 'faculty': "Faculty",129 ## 'department': "Dept",130 ## 'course': "Course",131 ## 'course_code_org': "Course Code",132 ## }133 ###)134 ## csv_d = {'jamb_reg_no': "JAMBRegno",135 ## 'name': "Name",136 ## 'score': "Score",137 ## 'sex': "Sex",138 ## 'course': "Course",139 ## 'faculty': "Faculty",140 ## 'department': "Dept",141 ## 'course_code_org': "Course Code",142 ## 'status': "Admission Status",143 ## 'result_type': None,144 ## }145 146 csv_d = {'jamb_reg_no': "reg_no",147 'name': "fullname",148 'score': "pume_score",149 'sex': "sex",150 'course': "study_course",151 'course_code_org': "study_course",152 'status': "admission_status",153 'result_type': "entry_mode",154 }155 156 csv_fields = [f[1] for f in csv_d.items() if f[1]]157 tr_count = 0158 total = 0159 #name = 'pup_new'160 #name = 'pup_update'161 name = 'Admitted_update'162 update = name.endswith('update')163 no_import = []164 ok_import = []165 ok_import.append('%s' % ','.join(['"%s"' % fn for fn in csv_d.keys()]))166 no_import.append('%s' % ','.join(['"%s"' % fn for fn in csv_fields]))167 current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")168 ok_import_name = "%s/import/%s_imported_%s.csv" % (i_home,name,current)169 #open(ok_import_name,"w").write('\n'.join(no_import))170 no_import_name = "%s/import/%s_not_imported_%s.csv" % (i_home,name,current)171 #open(no_import_name,"w").write('\n'.join(no_import))172 logger = logging.getLogger('Students.loadPumeResultsFromCSV')173 starttime = DateTime.now()174 logger.info('Start loading from %s.csv' % name)175 try:176 result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))177 except:178 logger.error('Error reading %s.csv' % name)179 return180 pume = self.portal_pumeresults181 format = ','.join(['"%%(%s)s"' % fn for fn in csv_fields])182 import_format = ','.join(['"%%(%s)s"' % fn for fn in csv_d.keys()])183 eduplicate = '%s,"duplicate"' % format184 eoriginal = '%s,"original"' % format185 einvalidjamb = '%s,"invalid JambRegNo"' % format186 added = 'added ,%s' % format187 #from pdb import set_trace;set_trace()188 for jamb in result:189 if not jamb.get(csv_d['score']):190 logger.info('Student %s has no pume_score' % jamb.get(csv_d['jamb_reg_no']))191 continue192 dict = {}193 for f,fn in csv_d.items():194 dict[f] = jamb.get(csv_d[f])195 dict['result_type'] = 'CEST'196 jnr = jamb.get(csv_d['jamb_reg_no'])197 #if not checkJambNo(jnr):198 # logger.info(einvalidjamb % jamb)199 # dd = {}200 # for f,fn in csv_d.items():201 # dd[fn] = getattr(data,f)202 # no_import.append(eduplicate % dd)203 # no_import.append(eduplicate % jamb)204 # continue205 res = pume(jamb_reg_no=jnr)206 if len(res) > 0:207 if update:208 try:209 pume.modifyRecord(**dict)210 # Can not happen, but anyway...211 except ValueError:212 logger.info(eduplicate % jamb)213 continue214 # Can not happen, but anyway...215 except KeyError:216 pume.addRecord(**dict)217 logger.info(added % jamb)218 continue219 else:220 data = res[0]221 if data.name != jamb.get(csv_d['name']):222 #set_trace()223 logger.info(eduplicate % jamb)224 #em = 'Student with REG-NO %(jamb_reg_no)s already exists\n' % dict225 #logger.info(em)226 dd = {}227 for f,fn in csv_d.items():228 dd[fn] = getattr(data,f)229 no_import.append(eoriginal % dd)230 no_import.append(eduplicate % jamb)231 continue232 else:233 try:234 pume.addRecord(**dict)235 ok_import.append(import_format % dict)236 except ValueError:237 logger.info(eduplicate % jamb)238 #em = 'Student with REG-NO %(jamb_reg_no)s already exists\n' % dict239 #logger.info(em)240 no_import.append(eduplicate % jamb)241 logger.info('End loading from %s.csv' % name)242 if len(no_import) > 1:243 open(no_import_name,"w+").write('\n'.join(no_import))244 open(ok_import_name,"w+").write('\n'.join(ok_import))245 return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))246 ###)247 248 security.declareProtected(ModifyPortalContent,"createStudents")###(249 def createStudents(self):250 """251 load addmitted Studentdata from CSV values and create Studentobjects.252 This is the current method to create new addmitted Students.253 Before running the eventservice for the students_catalog must be disabled.254 """255 import transaction256 import random257 #from pdb import set_trace258 wftool = self.portal_workflow259 #students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()260 students_folder = self.portal_url.getPortalObject().campus.students261 levels = {'ume_ft':'100',262 'de_ft': '200',263 'ug_pt': '100',264 'de_pt': '200',265 'pg_ft': '700',266 'pg_pt': '700',267 'dp_pt': '100',268 'dp_ft': '100',269 }270 csv_d = {'jamb_reg_no': "reg_no",271 'entry_mode': 'entry_mode',272 'jamb_firstname': "firstname",273 'jamb_middlename': "middlename",274 'jamb_lastname': "lastname",275 'jamb_sex': "sex",276 'jamb_state': "state",277 'birthday': "date_of_birth",278 'app_email': "email",279 'study_course': "study_course",280 'perm_address': "address",281 'admission_status': "admission_status",282 }283 csv_fields = [f[1] for f in csv_d.items()]284 tr_count = 0285 total = 0286 #name = 'pume_results'287 name = 'Admitted_update'288 no_import = []289 s = ','.join(['"%s"' % fn for fn in csv_fields])290 no_import.append('"Error",%s' % s)291 format = '"%(Error)s",' + ','.join(['"%%(%s)s"' % fn for fn in csv_fields])292 no_certificate = "no certificate %s" % format293 open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write('\n'.join(no_import))294 logger = logging.getLogger('Students.StudentsFolder.createStudents')295 logger.info('Start loading from %s.csv' % name)296 certs = {}297 try:298 results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))299 except:300 logger.error('Error reading %s.csv' % name)301 return302 for result in results:303 if not result.get(csv_d['admission_status']).startswith('Admitted'):304 continue305 #result['Error'] = "Processing "306 #logger.info(format % result)307 jamb_reg_no = result.get(csv_d['jamb_reg_no'])308 res = self.students_catalog(jamb_reg_no = jamb_reg_no)309 if res:310 em = 'Student with RegNo %s already exists\n' % jamb_reg_no311 logger.info(em)312 result['Error'] = "Student exists"313 no_import.append(format % result)314 continue315 cert_id = makeCertificateCode(result.get(csv_d['study_course']))316 if cert_id not in certs.keys():317 res = self.portal_catalog(meta_type = "Certificate",id = cert_id)318 if not res:319 em = 'No Certificate with ID %s \n' % cert_id320 logger.info(em)321 result['Error'] = "No Certificate %s" % cert_id322 no_import.append( format % result)323 continue324 cert = res[0]325 cert_path = cert.getPath().split('/')326 certificate = certs[cert_id] = {'faculty': cert_path[-4],327 'department': cert_path[-3]}328 cert_doc = certs[cert_id]329 catalog_entry = {}330 catalog_entry['jamb_reg_no'] = jamb_reg_no331 firstname = result.get(csv_d['jamb_firstname'])332 middlename = result.get(csv_d['jamb_middlename'])333 lastname = result.get(csv_d['jamb_lastname'])334 if len(firstname) < 3\335 and len(middlename) < 3\336 and len(lastname) < 3:337 em = 'Student Names to short \n'338 logger.info(em)339 result['Error'] = "Names to short"340 no_import.append( format % result)341 continue342 perm_address = result.get(csv_d['perm_address'])343 sid = self.generateStudentId('x')344 students_folder.invokeFactory('Student', sid)345 catalog_entry['id'] = sid346 tr_count += 1347 logger.info('%(total)s+%(tr_count)s: Creating Student with ID %(sid)s reg_no %(jamb_reg_no)s ' % vars())348 student = getattr(self,sid)349 student.manage_setLocalRoles(sid, ['Owner',])350 student.invokeFactory('StudentApplication','application')351 da = {'Title': 'Application Data'}352 da["jamb_firstname"] = firstname353 da["jamb_middlename"] = middlename354 da["jamb_lastname"] = lastname355 catalog_entry['entry_session'] = da["entry_session"] = self.getSessionId()[0]356 catalog_entry['sex'] = sex = result.get(csv_d['jamb_sex']).startswith('F')357 da_fields = ('jamb_reg_no',358 'jamb_sex',359 'jamb_state',360 'entry_mode',361 'app_email',362 )363 for f in da_fields:364 da[f] = result.get(csv_d[f])365 catalog_entry['email'] = da['app_email']366 catalog_entry['entry_mode'] = da['entry_mode']367 app = student.application368 app_doc = app.getContent()369 app.getContent().edit(mapping=da)370 picture ="%s/import/pictures/%s.jpg" % (i_home,jamb_reg_no)371 app.manage_setLocalRoles(sid, ['Owner',])372 373 picture_id = da['jamb_reg_no'].replace('/','_')374 file = None375 for ext in ('jpg','JPG'):376 picture ="%s/import/pictures_admitted_latest/%s.%s" % (i_home,picture_id,ext)377 if os.path.exists(picture):378 file = open(picture)379 break380 if file is not None:381 382 ## file conversion does not work383 #img = PIL.Image.open(file)384 #img.thumbnail((150,200),385 # resample=PIL.Image.ANTIALIAS)386 #outfile = StringIO()387 #img.save(outfile, format=img.format)388 389 outfile = file.read()390 app_doc.manage_addFile('passport',391 file=outfile,392 title="%s.jpg" % jamb_reg_no)393 #wftool.doActionFor(app,'close')394 dp = {}395 dp['firstname'] = firstname396 dp['middlename'] = middlename397 dp['lastname'] = lastname398 dp['email'] = da['app_email']399 dp['sex'] = sex400 dp['perm_address'] = perm_address401 catalog_entry['name'] = "%(firstname)s %(middlename)s %(lastname)s" % dp402 student.invokeFactory('StudentPersonal','personal')403 per = student.personal404 per_doc = per.getContent()405 per_doc.edit(mapping = dp)406 per.manage_setLocalRoles(sid, ['Owner',])407 wftool.doActionFor(student,'pume_pass')408 wftool.doActionFor(student,'admit')409 #410 # Clearance411 #412 student.invokeFactory('StudentClearance','clearance')413 #wftool.doActionFor(student.clearance,'open')414 clearance = student.clearance415 dc = {'Title': 'Clearance/Eligibility Record'}416 clearance = student.clearance417 date_str = result.get(csv_d['birthday'])418 try:419 date = DateTime.DateTime(date_str)420 except:421 #import pdb;pdb.set_trace()422 date = None423 dc['birthday'] = date424 clearance.getContent().edit(mapping=dc)425 clearance.manage_setLocalRoles(sid, ['Owner',])426 #427 # Study Course428 #429 student.invokeFactory('StudentStudyCourse','study_course')430 study_course = student.study_course431 dsc = {}432 catalog_entry['level'] = dsc['current_level'] = levels.get(da['entry_mode'],'100')433 #catalog_entry['level'] = dsc['current_level'] = '100' # Attention: not for DE students434 catalog_entry['session'] = dsc['current_session'] = da['entry_session']435 catalog_entry['mode'] = dsc['current_mode'] = da['entry_mode']436 catalog_entry['course'] = dsc['study_course'] = cert_id437 catalog_entry['faculty'] = certificate['faculty']438 catalog_entry['department'] = certificate['department']439 catalog_entry['verdict'] = dsc['current_verdict'] = 'N/A'440 catalog_entry['review_state'] = self.portal_workflow.getInfoFor(student,'review_state',None)441 study_course.getContent().edit(mapping=dsc)442 #import pdb;pdb.set_trace()443 self.students_catalog.addRecord(**catalog_entry)444 if tr_count > 100:445 if len(no_import) > 0:446 open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(447 '\n'.join(no_import) + "\n")448 no_import = []449 em = '%d transactions commited\n' % tr_count450 transaction.commit()451 logger.info(em)452 total += tr_count453 tr_count = 0454 open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(455 '\n'.join(no_import))456 return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))457 ###)458 118 459 119 security.declareProtected(ModifyPortalContent,"transferStudents")###( … … 619 279 ###) 620 280 621 security.declareProtected(ModifyPortalContent,"importReturningStudents")###(622 def importReturningStudents(self):623 """load Returning Studentdata from CSV values"""624 import transaction625 import random626 #from pdb import set_trace627 wftool = self.portal_workflow628 current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")629 #students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()630 students_folder = self.portal_url.getPortalObject().campus.students631 tr_count = 1632 total = 0633 #name = 'pume_results'634 name = 'Returning'635 table = self.returning_import636 no_import = []637 imported = []638 logger = logging.getLogger('Students.StudentsFolder.importReturningStudents')639 try:640 returning = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))641 except:642 logger.error('Error reading %s.csv' % name)643 return644 l = self.portal_catalog({'meta_type': "Certificate"})645 certs = {}646 cert_docs = {}647 for f in l:648 certs[f.getId] = f.getObject().getContent()649 start = True650 res = table()651 regs = []652 if len(res) > 0:653 regs = [s.matric_no for s in res]654 #import pdb;pdb.set_trace()655 for student in returning:656 if start:657 start = False658 logger.info('Start loading from %s.csv' % name)659 s = ','.join(['"%s"' % fn for fn in student.keys()])660 imported.append(s)661 no_import.append('%s,"Error"' % s)662 format = ','.join(['"%%(%s)s"' % fn for fn in student.keys()])663 format_error = format + ',"%(Error)s"'664 no_certificate = "no certificate %s" % format665 student['matric_no'] = matric_no = student.get('matric_no').upper()666 student['Mode_of_Entry'] = entry_mode = student.get('Mode of Entry').upper()667 student['Permanent_Address'] = perm_address = student.get('Permanent Address')668 if matric_no == '':669 student['Error'] = "Empty matric_no"670 no_import.append( format_error % student)671 continue672 if matric_no in regs or self.returning_import(matric_no = matric_no):673 student['Error'] = "Duplicate"674 no_import.append( format_error % student)675 continue676 cert_id = makeCertificateCode(student.get('Coursemajorcode'))677 if cert_id not in certs.keys():678 student['Error'] = "No Certificate %s" % cert_id679 no_import.append( format_error % student)680 continue681 try:682 table.addRecord(**student)683 except ValueError:684 student['Error'] = "Duplicate"685 no_import.append( format_error % student)686 continue687 regs.append(student.get('matric_no'))688 imported.append(format % student)689 tr_count += 1690 if tr_count > 1000:691 if len(no_import) > 0:692 open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(693 '\n'.join(no_import) + '\n')694 no_import = []695 open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(696 '\n'.join(no_import) + "\n")697 imported = []698 em = '%d transactions commited total %s\n' % (tr_count,total)699 transaction.commit()700 regs = []701 logger.info(em)702 total += tr_count703 tr_count = 0704 open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(705 '\n'.join(imported))706 open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(707 '\n'.join(no_import))708 return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))709 ###)710 711 security.declareProtected(ModifyPortalContent,"fixAllNames")###(712 def fixAllNames(self):713 "fix all students names"714 import transaction715 response = self.REQUEST.RESPONSE716 logger = logging.getLogger('fixAllNames')717 logger.info('Start')718 students = self.portal_catalog(portal_type='Student')719 count = 0720 total = 0721 for student in students:722 scat_res = self.students_catalog(id = student.getId)723 if not scat_res:724 self.students_catalog.addRecord(id = student.getId)725 scat_res = self.students_catalog(id = student.getId)726 student_entry = scat_res[0]727 old_new = self.fixName(student,student_entry)728 count += 1729 response_write(response,'"%d","%s",%s' % (count + total,student_entry.id,old_new))730 if count > 2000:731 transaction.commit()732 logger.info("%d transactions commited" % count)733 total += count734 count = 0735 ###)736 737 security.declareProtected(ModifyPortalContent,"fixName")###(738 def fixName(self,student_brain, student_entry):739 "fix the name of a student"740 fix = "first"741 if student_entry.get('name_fixed',None) == fix:742 return "Name already fixed"743 student_id = student_entry.id744 new_student = student_entry.jamb_reg_no.startswith('6')745 student_obj = student_brain.getObject()746 personal = getattr(student_obj,'personal',None)747 invalid = ''748 if personal is None:749 return '"%s","Returning","%s","%s"' % (invalid,student_entry.name,"not logged in")750 per_doc = personal.getContent()751 old_first = per_doc.firstname752 old_middle = per_doc.middlename753 old_last = per_doc.lastname754 new_first = ''755 new_middle = ''756 new_last = ''757 if new_student:758 if not old_first and not old_middle and old_last:759 new_names = [n.capitalize() for n in old_last.split()]760 if len(new_names) > 1:761 old_first = new_names[0]762 old_last = new_names[-1]763 old_middle = ' '.join(new_names[1:-1])764 else:765 old_last = new_names[0]766 old_first = ''767 old_middle = ''768 if old_first:769 new_first = old_first770 if old_middle:771 new_middle = old_middle772 if old_last:773 new_last = old_last774 if old_first.find('<') != -1 or\775 old_first.find('>') != -1 or\776 old_middle.find('<') != -1 or\777 old_middle.find('>') != -1 or\778 old_last.find('<') != -1 or\779 old_last.find('>') != -1:780 invalid = "invalid characters"781 else:782 new_first = old_first783 if new_first.strip() == '-':784 new_first = ''785 new_middle = old_middle786 if new_middle.strip() == '-':787 new_middle = ''788 new_last = old_last789 if new_last.strip() == '-':790 new_last = ''791 name = "%(new_first)s %(new_middle)s %(new_last)s" % vars()792 if new_student:793 text = "New"794 else:795 text = "Returning"796 old_new = '"%s","%s","%s","%s"' % (invalid,text,797 student_entry.name,798 name)799 if not invalid:800 self.students_catalog.modifyRecord(id = student_id,801 name_fixed = fix,802 name = name)803 per_doc.edit(mapping = {'firstname' : new_first,804 'middlename' : new_middle,805 'lastname' : new_last,806 })807 return old_new808 ###)809 810 security.declareProtected(ModifyPortalContent,"updateReturningStudents")###(811 def updateReturningStudents(self):812 """load and overwrite Returning Student Data from CSV values"""813 import transaction814 import random815 #from pdb import set_trace816 wftool = self.portal_workflow817 current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")818 #students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()819 students_folder = self.portal_url.getPortalObject().campus.students820 tr_count = 1821 total = 0822 #name = 'pume_results'823 name = 'Returning_update'824 table = self.returning_import825 no_import = []826 imported = []827 logger = logging.getLogger('Students.StudentsFolder.updateReturningStudents')828 try:829 returning = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))830 except:831 logger.error('Error reading %s.csv' % name)832 return833 l = self.portal_catalog({'meta_type': "Certificate"})834 certs = {}835 cert_docs = {}836 for f in l:837 certs[f.getId] = f.getObject().getContent()838 start = True839 res = table()840 regs = []841 if len(res) > 0:842 regs = [s.matric_no for s in res]843 for student in returning:844 if start:845 start = False846 logger.info('Start loading from %s.csv' % name)847 s = ','.join(['"%s"' % fn for fn in student.keys()])848 imported.append(s)849 no_import.append('%s,"Error"' % s)850 format = ','.join(['"%%(%s)s"' % fn for fn in student.keys()])851 format_error = format + ',"%(Error)s"'852 no_certificate = "no certificate %s" % format853 matric_no = student.get('matric_no').upper()854 student['matric_no'] = matric_no855 if matric_no == '':856 student['Error'] = "Empty matric_no"857 no_import.append( format_error % student)858 continue859 # if matric_no in regs or self.returning_import(matric_no = matric_no):860 # student['Error'] = "Duplicate"861 # no_import.append( format_error % student)862 # continue863 # cert_id = makeCertificateCode(student.get('Coursemajorcode'))864 # if cert_id not in certs.keys():865 # student['Error'] = "No Certificate %s" % cert_id866 # no_import.append( format_error % student)867 # continue868 try:869 table.modifyRecord(**student)870 except KeyError:871 #import pdb;pdb.set_trace()872 student['Error'] = "no Student found to update"873 no_import.append( format_error % student)874 continue875 #s = self.students_catalog(matric_no=matric_no)876 #if s:877 # level = "%s" % (int(student.get('Level')) + 100)878 # self.students_catalog.modifyRecord(id = s[0].id,879 # level=level)880 881 regs.append(student.get('matric_no'))882 imported.append(format % student)883 tr_count += 1884 if tr_count > 1000:885 if len(no_import) > 0:886 open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(887 '\n'.join(no_import) + '\n')888 no_import = []889 open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(890 '\n'.join(no_import) + "\n")891 imported = []892 em = '%d transactions commited total %s\n' % (tr_count,total)893 transaction.commit()894 regs = []895 logger.info(em)896 total += tr_count897 tr_count = 0898 open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(899 '\n'.join(imported))900 open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(901 '\n'.join(no_import))902 return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))903 ###)904 905 security.declareProtected(ModifyPortalContent,"exportStudents")###(906 def exportStudents(self):907 """export Studentsdata to a file"""908 member = self.portal_membership.getAuthenticatedMember()909 logger = logging.getLogger('Students.exportStudents')910 current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")911 students_folder = self.portal_url.getPortalObject().campus.students912 export_file = "%s/export/students_%s.csv" % (i_home,current)913 914 from Products.AdvancedQuery import Eq, Between, Le,In,MatchRegexp915 aq_students = self.students_catalog.evalAdvancedQuery916 toexport = {'students_catalog': ("id",917 "matric_no",918 "jamb_reg_no",919 "name",920 "review_state",921 "entry_session",922 "session",923 "entry_mode",924 "mode",925 "verdict",926 "sex",927 "email",928 "phone",929 "faculty",930 "department",931 "course",932 "level",933 ),934 'personal': ('firstname',935 'middlename',936 'lastname',937 'perm_address',938 ),939 'clearance': ('state', # is not an attribute of clearance but is needed for splitting lga940 'lga',941 )942 }943 res_list = []944 lines = []945 fields = []946 with_lga = False947 for k in toexport.keys():948 for f in toexport[k]:949 if f == 'lga' :950 with_lga = True951 fields.append(f)952 headline = ','.join(fields).replace('level','current_level')953 open(export_file,"a").write(headline +'\n')954 format = '"%(' + ')s","%('.join(fields) + ')s"'955 query = In('review_state',('cleared_and_validated',956 'clearance_requested',957 'school_fee_paid',958 'courses_registered',959 'courses_validated'))960 #query = In('review_state',('clearance_requested'))961 students = aq_students(query)962 nr2export = len(students)963 logger.info('%s starts exportStudents, %s student records to export' % (member,nr2export))964 chunk = 1000965 total = 0966 start = DateTime.DateTime().timeTime()967 start_chunk = DateTime.DateTime().timeTime()968 ## alternative method slightly slower969 # student_recs = {}970 # for s in students:971 # student_recs[s.id] = s972 # catalog_recs = {}973 # brains = self.portal_catalog(portal_type = 'Student')974 # for cat_rec in brains:975 # sid = cat_rec.getId976 # catalog_recs[sid] = cat_rec977 # #import pdb;pdb.set_trace()978 # start = DateTime.DateTime().timeTime()979 # start_chunk = DateTime.DateTime().timeTime()980 # for student in students:981 # if student.id not in student_recs.keys():982 # continue983 # not_all = False984 # d = self.getFormattedStudentEntry(student_recs[student.id])985 # student_obj = catalog_recs[student.id].getObject()986 for student in students:987 not_all = False988 d = self.getFormattedStudentEntry(student)989 student_obj = getattr(students_folder,student.id)990 for k in toexport.keys()[1:]:991 try:992 object = getattr(student_obj,k)993 object_doc = object.getContent()994 except:995 logger.info('%s %s record not found' % (student.id,k))996 not_all = True997 continue998 for f in toexport[k]:999 d[f] = getattr(object_doc,f,'')1000 if not_all:1001 continue1002 if with_lga:1003 d['state'],d['lga'] = formatLGA(d['lga'],voc = self.portal_vocabularies.local_gov_areas)1004 lines.append(format % d)1005 total += 11006 if total and not total % chunk or total == len(students):1007 open(export_file,"a").write('\n'.join(lines) +'\n')1008 anz = len(lines)1009 logger.info("wrote %(anz)d total written %(total)d" % vars())1010 end_chunk = DateTime.DateTime().timeTime()1011 duration = end_chunk-start_chunk1012 per_record = duration/anz1013 till_now = end_chunk - start1014 avarage_per_record = till_now/total1015 estimated_end = DateTime.DateTime(start + avarage_per_record * nr2export)1016 estimated_end = estimated_end.strftime("%H:%M:%S")1017 logger.info('%(duration)4.1f, %(per_record)4.3f,end %(estimated_end)s' % vars())1018 start_chunk = DateTime.DateTime().timeTime()1019 lines = []1020 end = DateTime.DateTime().timeTime()1021 logger.info('total time %6.2f m' % ((end-start)/60))1022 filename, extension = os.path.splitext(export_file)1023 from subprocess import call1024 msg = "wrote %(total)d records to %(export_file)s" % vars()1025 try:1026 retcode = call('gzip %s' % (export_file),shell=True)1027 if retcode == 0:1028 msg = "wrote %(total)d records to %(export_file)s.gz" % vars()1029 except OSError, e:1030 retcode = -991031 logger.info("zip failed with %s" % e)1032 logger.info(msg)1033 args = {'portal_status_message': msg}1034 #url = self.REQUEST.get('URL1') + '?' + urlencode(args)1035 url = self.REQUEST.get('URL2')1036 return self.REQUEST.RESPONSE.redirect(url)1037 ###)1038 281 1039 282 security.declareProtected(ModifyPortalContent,"dumpStudentsCatalog")###( … … 1216 459 ###) 1217 460 1218 security.declareProtected(ModifyPortalContent,"updateStudyCourse")###( 1219 def updateStudyCourse(self): 1220 """update StudyCourse from CSV values""" 1221 import transaction 1222 import random 1223 from pdb import set_trace 1224 wftool = self.portal_workflow 1225 #students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject() 1226 students_folder = self.portal_url.getPortalObject().campus.students 1227 csv_d = {'jamb_reg_no': "RegNumber", 1228 'jamb_lastname': "Name", 1229 'session': "Session", 1230 'pume_tot_score': "PUME SCORE", 1231 'jamb_score': "JambScore", 1232 'jamb_sex': "Sex", 1233 'jamb_state': "State", 1234 ## 'jamb_first_cos': "AdminCourse", 1235 'faculty': "AdminFaculty", 1236 'course_code': "AdmitCoscode", 1237 'stud_status':"AdmitStatus", 1238 'department': "AdmitDept", 1239 'jamb_lga': "LGA", 1240 'app_email': "email", 1241 'app_mobile': "PhoneNumbers", 1242 } 1243 csv_fields = [f[1] for f in csv_d.items()] 1244 tr_count = 0 1245 total = 0 1246 #name = 'pume_results' 1247 name = 'StudyCourseChange' 1248 no_import = [] 1249 s = ','.join(['"%s"' % fn for fn in csv_fields]) 1250 no_import.append('"Error",%s' % s) 1251 format = '"%(Error)s",' + ','.join(['"%%(%s)s"' % fn for fn in csv_fields]) 1252 no_certificate = "no certificate %s" % format 1253 open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write( 1254 '\n'.join(no_import)) 1255 logger = logging.getLogger('Students.StudentsFolder.updateStudyCourse') 1256 logger.info('Start loading from %s.csv' % name) 1257 l = self.portal_catalog({'meta_type': "Certificate"}) 1258 try: 1259 result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb")) 1260 except: 1261 logger.error('Error reading %s.csv' % name) 1262 return 1263 for jamb in result: 1264 jamb['Error'] = "Processing " 1265 logger.info(format % jamb) 1266 jamb_reg_no = jamb.get(csv_d['jamb_reg_no']) 1267 res = self.portal_catalog({'portal_type': "StudentApplication", 1268 'SearchableText': jamb_reg_no }) 1269 if not res: 1270 em = 'Student with jamb_reg_no %s does not exists\n' % jamb_reg_no 1271 logger.info(em) 1272 jamb['Error'] = "Student does not exist" 1273 no_import.append(format % jamb) 1274 continue 1275 sid = res[0].getPath().split('/')[-2] 1276 cert_id = makeCertificateCode(jamb.get(csv_d['course_code'])) 1277 res = self.portal_catalog(portal_type = "Certificate", id = cert_id) 1278 if not res: 1279 em = 'No Certificate with ID %s \n' % cert_id 1280 logger.info(em) 1281 jamb['Error'] = "No Certificate %s" % cert_id 1282 no_import.append( format % jamb) 1283 continue 1284 cert_brain = res[0] 1285 catalog_entry = {} 1286 student = getattr(self,sid) 1287 # 1288 # Study Course 1289 # 1290 study_course = student.study_course 1291 dsc = {} 1292 cert_pl = cert_brain.getPath().split('/') 1293 catalog_entry['id'] = sid 1294 catalog_entry['faculty'] = cert_pl[-4] 1295 catalog_entry['department'] = cert_pl[-3] 1296 catalog_entry['course'] = cert_id 1297 dsc['study_course'] = cert_id 1298 study_course.getContent().edit(mapping=dsc) 1299 self.students_catalog.modifyRecord(**catalog_entry) 1300 if tr_count > 10: 1301 if len(no_import) > 1: 1302 open("%s/import/%s_not_imported.csv" % (i_home,name),"w+").write( 1303 '\n'.join(no_import)) 1304 no_import = [] 1305 em = '%d transactions commited\n' % tr_count 1306 transaction.commit() 1307 logger.info(em) 1308 total += tr_count 1309 tr_count = 0 1310 tr_count += 1 1311 return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1')) 1312 ###) 461 1313 462 1314 463 security.declareProtected(View,"fixOwnership") ###(
Note: See TracChangeset for help on using the changeset viewer.