412 """ |
412 """ |
413 # TODO(Pawel.Solyga): Add additional Program parameter to this method |
413 # TODO(Pawel.Solyga): Add additional Program parameter to this method |
414 # so we export students from different programs |
414 # so we export students from different programs |
415 # TODO(Pawel.Solyga): Make it universal so it works with both GHOP |
415 # TODO(Pawel.Solyga): Make it universal so it works with both GHOP |
416 # and GSoC programs |
416 # and GSoC programs |
417 |
417 |
418 from soc.models.student_project import StudentProject |
418 from soc.models.student_project import StudentProject |
419 from soc.models.student import Student |
419 from soc.models.student import Student |
420 from soc.models.organization import Organization |
420 from soc.models.organization import Organization |
421 |
421 |
422 getStudentProjects = getEntities(StudentProject) |
422 getStudentProjects = getEntities(StudentProject) |
423 student_projects = getStudentProjects() |
423 student_projects = getStudentProjects() |
424 student_projects_amount = len(student_projects) |
424 student_projects_amount = len(student_projects) |
425 print "Fetched %d Student Projects." % student_projects_amount |
425 print "Fetched %d Student Projects." % student_projects_amount |
426 print "Fetching Student entities from Student Projects." |
426 print "Fetching Student entities from Student Projects." |
427 accepted_students = {} |
427 accepted_students = {} |
428 student_extra_data = {} |
428 student_extra_data = {} |
429 counter = 0 |
429 counter = 0 |
430 |
430 |
431 for sp_key in student_projects.keys(): |
431 for sp_key in student_projects.keys(): |
432 key = student_projects[sp_key].student.key().name() |
432 key = student_projects[sp_key].student.key().name() |
433 accepted_students[key] = student_projects[sp_key].student |
433 accepted_students[key] = student_projects[sp_key].student |
434 org_name = student_projects[sp_key].scope.name |
434 org_name = student_projects[sp_key].scope.name |
435 student_extra_data[key] = {} |
435 student_extra_data[key] = {} |
436 student_extra_data[key]['organization'] = org_name |
436 student_extra_data[key]['organization'] = org_name |
437 student_extra_data[key]['project_status'] = student_projects[sp_key].status |
437 student_extra_data[key]['project_status'] = student_projects[sp_key].status |
438 counter += 1 |
438 counter += 1 |
|
439 |
439 print str(counter) + '/' + str(student_projects_amount) + ' ' + key + ' (' + org_name + ')' |
440 print str(counter) + '/' + str(student_projects_amount) + ' ' + key + ' (' + org_name + ')' |
440 print "All Student entities fetched." |
441 print "All Student entities fetched." |
441 |
442 |
442 students_key_order = ['link_id', 'given_name', 'surname', |
443 students_key_order = ['link_id', 'given_name', 'surname', |
443 'name_on_documents', 'email', 'res_street', 'res_city', 'res_state', |
444 'name_on_documents', 'email', 'res_street', 'res_city', 'res_state', |
444 'res_country', 'res_postalcode', 'phone', 'ship_street', 'ship_city', |
445 'res_country', 'res_postalcode', 'phone', 'ship_street', 'ship_city', |
445 'ship_state', 'ship_country', 'ship_postalcode', 'birth_date', |
446 'ship_state', 'ship_country', 'ship_postalcode', 'birth_date', |
446 'tshirt_size', 'tshirt_style', 'name', 'school_name', 'school_country', |
447 'tshirt_size', 'tshirt_style', 'name', 'school_name', 'school_country', |
447 'major', 'degree'] |
448 'major', 'degree'] |
448 |
449 |
449 print "Preparing Students data for export." |
450 print "Preparing Students data for export." |
450 students_data = [accepted_students[i].toDict(students_key_order) for i in accepted_students.keys()] |
451 students_data = [accepted_students[i].toDict(students_key_order) for i in accepted_students.keys()] |
451 |
452 |
452 print "Adding organization name and project status to Students data." |
453 print "Adding organization name and project status to Students data." |
453 for student in students_data: |
454 for student in students_data: |
454 extra_data = student_extra_data[program_key_name + '/' + student['link_id']] |
455 extra_data = student_extra_data[program_key_name + '/' + student['link_id']] |
455 student['organization'] = extra_data['organization'] |
456 student['organization'] = extra_data['organization'] |
456 student['project_status'] = extra_data['project_status'] |
457 student['project_status'] = extra_data['project_status'] |
457 |
458 |
458 students_key_order.append('organization') |
459 students_key_order.append('organization') |
459 students_key_order.append('project_status') |
460 students_key_order.append('project_status') |
460 |
461 |
461 saveDataToCSV(csv_filename, students_data, students_key_order) |
462 saveDataToCSV(csv_filename, students_data, students_key_order) |
462 print "Accepted Students exported to %s file." % csv_filename |
463 print "Accepted Students exported to %s file." % csv_filename |
463 |
464 |
464 |
465 |
|
466 def exportUniqueOrgAdminsAndMentors(csv_filename, scope_path_start): |
|
467 """Exports Org Admins and Mentors to a CSV file, one per User. |
|
468 |
|
469 Args: |
|
470 csv_filename: the name of the csv file to save |
|
471 scope_path_start: the start of the scope path of the roles to get could be |
|
472 google/gsoc2009 if you want to export all GSoC 2009 Org Admins and |
|
473 Mentors. |
|
474 """ |
|
475 |
|
476 from soc.models.mentor import Mentor |
|
477 from soc.models.org_admin import OrgAdmin |
|
478 |
|
479 print 'Retrieving all Mentors' |
|
480 mentors = getEntities(Mentor)() |
|
481 all_mentors = mentors.values() |
|
482 |
|
483 print 'Retrieving all Org Admins' |
|
484 org_admins = getEntities(OrgAdmin)() |
|
485 all_org_admins = org_admins.values() |
|
486 |
|
487 print 'Combining the list of Mentors and Org Admins' |
|
488 unique_users = {} |
|
489 all_users = [] |
|
490 all_users.extend(all_mentors) |
|
491 all_users.extend(all_org_admins) |
|
492 |
|
493 for user in all_users: |
|
494 if not user.scope_path.startswith(scope_path_start) or \ |
|
495 user.status == 'invalid': |
|
496 # not the correct program or valid user |
|
497 continue |
|
498 |
|
499 unique_users[user.link_id] = user |
|
500 |
|
501 export_fields = ['link_id', 'given_name', 'surname', |
|
502 'document_name', 'email', 'res_street', 'res_city', 'res_state', |
|
503 'res_country', 'res_postalcode', 'phone', 'shipping_street', |
|
504 'shipping_city', 'shipping_state', 'shipping_country', |
|
505 'shipping_postalcode', 'birth_date', 'tshirt_size', 'tshirt_style'] |
|
506 |
|
507 print 'Preparing the data for export' |
|
508 data = [user.toDict(field_names=export_fields) for user in unique_users.values()] |
|
509 |
|
510 print 'Exporting the data to CSV' |
|
511 saveDataToCSV(csv_filename, data, export_fields) |
|
512 |
|
513 |
465 def saveDataToCSV(csv_filename, data, key_order): |
514 def saveDataToCSV(csv_filename, data, key_order): |
466 """Saves data in order into CSV file. |
515 """Saves data in order into CSV file. |
|
516 |
|
517 This is a helper function used for exporting CSV data. |
467 |
518 |
468 This is a helper function used with acceptedStudentsCSVExport(). |
519 Args: |
469 """ |
520 csv_filename: The name of the file where to save the CSV data |
470 |
521 data: the data dict to write to CSV |
|
522 key_order: the order in which to export the data in data dict |
|
523 """ |
|
524 |
471 import csv |
525 import csv |
472 import StringIO |
526 import StringIO |
473 |
527 |
474 from soc.logic import dicts |
528 from soc.logic import dicts |
475 |
529 |
476 file_handler = StringIO.StringIO() |
530 file_handler = StringIO.StringIO() |
477 |
531 |
478 writer = csv.DictWriter(file_handler, key_order, dialect='excel') |
532 # ignore the extra data |
|
533 writer = csv.DictWriter(file_handler, key_order, extrasaction='ignore', dialect='excel') |
479 writer.writerow(dicts.identity(key_order)) |
534 writer.writerow(dicts.identity(key_order)) |
480 |
535 |
481 # encode the data to UTF-8 to ensure compatibiliy |
536 # encode the data to UTF-8 to ensure compatibiliy |
482 for row_dict in data: |
537 for row_dict in data: |
483 for key in row_dict.keys(): |
538 for key in row_dict.keys(): |
484 value = row_dict[key] |
539 value = row_dict[key] |
485 if isinstance(value, basestring): |
540 if isinstance(value, basestring): |
486 row_dict[key] = value.encode("utf-8") |
541 row_dict[key] = value.encode("utf-8") |
487 else: |
542 else: |
488 row_dict[key] = str(value) |
543 row_dict[key] = str(value) |
489 writer.writerow(row_dict) |
544 writer.writerow(row_dict) |
490 |
545 |
491 csv_data = file_handler.getvalue() |
546 csv_data = file_handler.getvalue() |
492 csv_file = open(csv_filename, 'w') |
547 csv_file = open(csv_filename, 'w') |
493 csv_file.write(csv_data) |
548 csv_file.write(csv_data) |
494 csv_file.close() |
549 csv_file.close() |
495 |
550 |