# HG changeset patch # User Pawel Solyga # Date 1254767706 -7200 # Node ID 63625e7e0caccf77a6b31b19ad7d01b66a79a54c # Parent ad05c8063e370df89dfe52ada1e509d5c1e65cc4 Add function for CSV export of survey records for a given survey. diff -r ad05c8063e37 -r 63625e7e0cac scripts/stats.py --- a/scripts/stats.py Mon Oct 05 19:09:58 2009 +0200 +++ b/scripts/stats.py Mon Oct 05 20:35:06 2009 +0200 @@ -733,6 +733,119 @@ print "Exported Roles for Google Code to %s file." % csv_filename +def entityToDict(entity, field_names=None): + """Returns a dict with all specified values of this entity. + + Args: + entity: entity that will be converted to dictionary + field_names: the fields that should be included, defaults to + all fields that are of a type that is in DICT_TYPES. + """ + from google.appengine.ext import db + + DICT_TYPES = (db.StringProperty, db.IntegerProperty) + result = {} + + if not field_names: + props = entity.properties().iteritems() + field_names = [k for k, v in props if isinstance(v, DICT_TYPES)] + + for key in field_names: + # Skip everything that is not valid + if not hasattr(entity, key): + continue + + result[key] = getattr(entity, key) + + if hasattr(entity, 'name'): + name_prop = getattr(entity, 'name') + if callable(name_prop): + result['name'] = name_prop() + + return result + + +def surveyRecordCSVExport(csv_filename, survey_record_model, + survey_model, survey_key): + """CSV export for Survey Records for selected survey type and given survey key. + + Args: + csv_filename: the name of the csv file to save + survey_record_model: model of surver record that will be exported + survey_model: model of the survey that wil be exported + survey_key: key of the survey that records will be exported + """ + from soc.models.project_survey import ProjectSurvey + from soc.models.grading_project_survey import GradingProjectSurvey + + # fetch survey + survey = survey_model.get(survey_key) + + if not survey: + print "Survey of given model and key doesn't exist." + return + + schema = eval(survey.survey_content.schema) + ordered_properties = survey.survey_content.orderedProperties() + + getSurveyRecords = getEntities(survey_record_model) + survey_records = getSurveyRecords() + survey_records_amount = len(survey_records) + print "Fetched %d Survey Records." % survey_records_amount + + count = 0 + + print "Preparing SurveyRecord data for export." + + sr_key = {} + comments_properties = [] + for property_name in ordered_properties: + sr_key[property_name] = schema[property_name]['question'] + if schema[property_name]['has_comment']: + sr_key['comment_for_' + property_name] = 'None' + comments_properties.append('comment_for_' + property_name) + + for comment in comments_properties: + ordered_properties.append(comment) + + survey_record_data = [] + for i in survey_records.keys(): + if str(survey_records[i].survey.key()) != survey_key: + continue + data = entityToDict(survey_records[i], ordered_properties) + + if (survey_model == GradingProjectSurvey) or \ + (survey_model == ProjectSurvey): + data['organization'] = survey_records[i].org.name + data['project_title'] = survey_records[i].project.title + data['user_link_id'] = survey_records[i].user.link_id + + if survey_model == GradingProjectSurvey: + data['project_grade'] = survey_records[i].grade + + survey_record_data.append(data) + + count += 1 + print str(count) + '/' + str(survey_records_amount) + ' ' + str(i) + + if (survey_model == GradingProjectSurvey) or (survey_model == ProjectSurvey): + ordered_properties.append('organization') + ordered_properties.append('project_title') + ordered_properties.append('user_link_id') + sr_key['organization'] = 'None' + sr_key['project_title'] = 'None' + sr_key['user_link_id'] = 'None' + + if survey_model == GradingProjectSurvey: + ordered_properties.append('project_grade') + sr_key['project_grade'] = 'None' + + survey_record_data.insert(0, sr_key) + + saveDataToCSV(csv_filename, survey_record_data, ordered_properties) + print "Survey Records exported to %s file." % csv_filename + + def main(args): """Main routine. """ @@ -793,6 +906,7 @@ 'exportOrgsForGoogleCode': exportOrgsForGoogleCode, 'exportRolesForGoogleCode': exportRolesForGoogleCode, 'startUniqueUserIdConversion': startUniqueUserIdConversion, + 'surveyRecordCSVExport': surveyRecordCSVExport, } interactive.remote(args, context)