def load_from_string(self, json_string):
     model_manager = ModelManager()
     groups = {}
     individuals = {}
     j = json.loads(json_string)
     if j:        
         # load groups
         if 'groups' in j:
             if len(j['groups']):
                 for group_id, g_v in j['groups'].iteritems():
                     group = Group(str(group_id))
                     group.max_size = g_v['max']
                     groups[str(group_id)] = group
             else:
                 raise Exception("Invalid JSON string for preference input. Must have at least one group defined in 'groups' dictionary.")         
         else:
             raise Exception("Invalid JSON string for preference input. Must have 'groups' dictionary.")
         
         # load individuals
         if 'individuals' in j:
             if len(j['individuals']):
                 for individual_id, i_v in j['individuals'].iteritems():
                     individual = Individual(str(individual_id))
                     for group_id, group_pref_value in i_v['prefs'].iteritems():
                         individual.set_group_pref_value(str(group_id), float(group_pref_value))
                     individuals[str(individual_id)] = individual
             else:
                 raise Exception("Invalid JSON string for preference input. Must have at least one group defined in 'individuals' dictionary.")         
         else:
             raise Exception("Invalid JSON string for preference input. Must have 'individuals' dictionary.")
     
     model_manager.individuals = individuals
     model_manager.groups = groups     
     return model_manager
    def _get_individuals_from_csv_dict_reader(self, reader):
        individuals = {}
        row_num = 0
        for row in reader:
            row_num += 1
            # lowercase and strip column names
            row = dict((k.lower().strip(), v) for k,v in row.iteritems())
            field_names = self._get_field_names_from_csv_dict_reader(reader)
            individual_id = str(row['individual_id'])
            if individual_id is None:
                raise Exception('Invalid CSV preference file. On row number ' + str(row_num) + ', missing individual_id')
            elif individual_id in individuals:
                raise Exception('Invalid CSV preference file. On row number ' + str(row_num) + ', duplicate individual_id: ' + individual_id)

            i_k = str(individual_id)
            individual = Individual(individual_id)                        
            for field_name in field_names:
                if field_name != 'individual_id':
                    (group_id, group_max_size) = self._parse_csv_group_field_name(field_name)
                    group_pref_value = float(row[field_name])
                    individual.set_group_pref_value(str(group_id), float(group_pref_value))            
            individuals[str(individual.id)] = individual
        return individuals