scripts/stats.py
changeset 2769 279d26439495
parent 2642 1bb33f56a3f4
child 2770 71a5a56cf29e
equal deleted inserted replaced
2768:97a1569b2743 2769:279d26439495
    75   result['%s_key' % fieldname] = target[fieldname].key().name()
    75   result['%s_key' % fieldname] = target[fieldname].key().name()
    76   return result
    76   return result
    77 
    77 
    78 
    78 
    79 def getEntities(model):
    79 def getEntities(model):
    80   """Returns all users as dictionary.
    80   """Returns all entities as dictionary keyed on their id_or_name property.
    81   """
    81   """
    82 
    82 
    83   def wrapped():
    83   def wrapped():
    84     gen = lambda: model.all()
    84     gen = lambda: model.all()
    85     it = interactive.deepFetch(gen)
    85     it = interactive.deepFetch(gen)
   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 
   548       'rawSaver': rawSaver,
   603       'rawSaver': rawSaver,
   549       'startSpam': startSpam,
   604       'startSpam': startSpam,
   550       'reviveJobs': reviveJobs,
   605       'reviveJobs': reviveJobs,
   551       'deidleJobs': deidleJobs,
   606       'deidleJobs': deidleJobs,
   552       'acceptedStudentsCSVExport': acceptedStudentsCSVExport,
   607       'acceptedStudentsCSVExport': acceptedStudentsCSVExport,
       
   608       'exportUniqueOrgAdminsAndMentors': exportUniqueOrgAdminsAndMentors,
   553       'startUniqueUserIdConversion': startUniqueUserIdConversion,
   609       'startUniqueUserIdConversion': startUniqueUserIdConversion,
   554   }
   610   }
   555 
   611 
   556   interactive.remote(args, context)
   612   interactive.remote(args, context)
   557 
   613