def test_missing_unique_field(self): # Contains fields 'First Name', "Last Name', 'Age', 'ID' spreadsheet = 'bulkimport/testdata/names.xlsx' bi = BulkDataImportHandler() bi.add_mapping(Person, { 'First Name': 'first_name', 'Last Name': 'last_name', 'Age': 'age' }, 'PersonID', 'id') with self.assertRaises(MissingUniqueHeaderException): affected_records, stats = bi.process_spreadsheet(spreadsheet)
def setup_accessions_importer(): bi = BulkDataImportHandler() bi.add_mapping(Accession, { 'UQ Accession': 'uq_accession', 'Material': 'material', 'Source': 'source', 'State': 'state', 'Family': 'family', 'SUBFAM': 'subfam', 'TRIBE': 'tribe', 'Genus': 'genus', 'Species': 'species', 'AUTHOR': 'author', 'SSPNA': 'sspna', 'SSPAU': 'sspau', 'VARNA': 'varna', 'VARAU': 'varau', 'CULTIVAR': 'cultivar', 'Common Name': 'common_name', 'Biological Synonym': 'biological_synonym', 'FAMNO': 'famno', 'GENNO': 'genno', 'SPNO': 'spno', 'SSPNO': 'sspno', 'VARNO': 'varno', 'DETNA': 'detna', 'DETDATE': 'detdate', 'Collector': 'collector', 'Collector Serial No.': 'collector_serial_no', 'Collection Date': 'collection_date', 'SOURCE': 'source', 'SOURCE NUMBER': 'source_number', 'id level flag': 'id_level_flag', 'Country': 'country', 'Site Name': 'site_name', 'Lat/Long.': 'lat_long', 'Altitude': 'altitude', 'Notes': 'notes', 'Related Accession': 'related_accession', 'GRIN & Seed Atlas?': 'grin__seed_atlas', }) bi.header_row = 1 bi.first_data_row = 2 return bi
def test_read_simple_spreadsheet(self): """ Load in a simple spreadsheet """ spreadsheet = 'bulkimport/testdata/names.xlsx' bi = BulkDataImportHandler() bi.add_mapping(Person, { 'First Name': 'first_name', 'Last Name': 'last_name', 'Age': 'age' }) affected_records, stats = bi.process_spreadsheet(spreadsheet) self.assertEqual(3, len(affected_records)) self.assertEqual('Bob', affected_records[0][0].first_name) self.assertEqual(50, affected_records[2][0].age)
def test_read_spreadsheet_case_insensitive(self): """ Test the column names to be mapped are case insensitive """ spreadsheet = 'bulkimport/testdata/names.xlsx' bi = BulkDataImportHandler() bi.add_mapping(Person, { 'First name': 'first_name', 'Last NaMe': 'last_name', 'Age': 'age' }) affected_records, stats = bi.process_spreadsheet(spreadsheet) self.assertEqual(3, len(affected_records)) self.assertEqual('Bob', affected_records[0][0].first_name) self.assertEqual(50, affected_records[2][0].age)
def test_unique_field(self): # Contains fields 'First Name', "Last Name', 'Age', 'ID' spreadsheet = 'bulkimport/testdata/names.xlsx' bi = BulkDataImportHandler() bi.add_mapping( Person, { 'First Name': 'first_name', 'Last Name': 'last_name', 'Age': 'age', 'ID': 'id' }, 'ID', 'id') affected_records, stats = bi.process_spreadsheet(spreadsheet) self.assertEqual(3, len(affected_records)) self.assertEqual('Bob', affected_records[0][0].first_name) self.assertEqual(50, affected_records[2][0].age)
def test_process_row_multi(self): mapping_1 = {'one': 'one'} save_mock_1 = mock.Mock(return_value=None) model_1 = mock.Mock(MyModel) model_1.return_value.save = save_mock_1 mapping_2 = {'two': 'two'} save_mock_2 = mock.Mock(return_value=None) model_2 = mock.Mock(MyModel) model_2.return_value.save = save_mock_2 linking_func = mock.Mock() bdih = BulkDataImportHandler() bdih.add_mapping(model_1, mapping_1) bdih.add_mapping(model_2, mapping_2) bdih.add_linking_function(linking_func) headers = ['one', 'two'] vals = ['val1', 'spot'] affected_records, stats = bdih.process_row(headers, vals) result_1, result_2 = affected_records # make sure one class each was created self.assertEqual(model_1.call_count, 1) self.assertEqual(model_2.call_count, 1) # now make sure each save was called once self.assertEqual(save_mock_1.call_count, 1) self.assertEqual(save_mock_2.call_count, 1) # check values were saved onto each instance self.assertEqual('val1', result_1.one) self.assertEqual('spot', result_2.two) # check the linking function was called self.assertTrue(linking_func.called) linking_func.assert_called_with(result_1, result_2)
def test_process_row_single(self): mapping = {'one': 'one'} save_mock = mock.Mock(return_value=None) model = mock.Mock(MyModel) model.return_value.save = save_mock bdih = BulkDataImportHandler() bdih.add_mapping(model, mapping) headers = ['one', 'two'] vals = ['val1', 'spot'] affected_records, used_cols = bdih.process_row(headers, vals) new_record = affected_records[0] # make sure class was created self.assertEqual(model.call_count, 1) # now make sure save was called once self.assertEqual(save_mock.call_count, 1) self.assertEqual('val1', new_record.one)
def setup_wood_importer(): bi = BulkDataImportHandler() bi.add_mapping(Accession, { 'family': 'family', 'Genus': 'genus', 'Species': 'species', 'Common Name': 'common_name', # 'Indigenous Name': 'indigenous_name', 'Accession': 'uq_accession', 'Specimen Collection Date': 'collection_date', # 'Specimen Collection Location': 'specimen_collection_location', # 'Specimen Collection Information': 'specimen_collection_information', # 'Voucher Category': 'voucher_category', # 'Geographic Range': 'geographic_range', # 'Habitat': 'habitat', # 'Plant part': 'plant_part', 'State': 'state', # 'Type of Plant': 'type_of_plant', }) bi.add_mapping(WoodFeatures, { 'aggregate rays': 'aggregate_rays', 'Australia': 'australia', 'axial canals': 'axial_canals', 'axial parenchyma arrangment': 'axial_parenchyma_arrangment', 'axial parenchyma bands': 'axial_parenchyma_bands', 'axial parenchyma present': 'axial_parenchyma_present', 'cambial variants': 'cambial_variants', 'druses': 'druses', 'family': 'family', 'fibre helical thickenings': 'fibre_helical_thickenings', 'fibre pits': 'fibre_pits', 'fibres wall thickeness': 'fibres_wall_thickeness', 'fusiform parenchyma cells': 'fusiform_parenchyma_cells', 'helical thickenings': 'helical_thickenings', 'included phloem': 'included_phloem', 'Indigenous name': 'indigenous_name', 'intervessels pits arrangment': 'intervessels_pits_arrangment', 'intervessels pits size': 'intervessels_pits_size', 'intervessels pits specific shapes': 'intervessels_pits_specific_shapes', 'lactifers tanniferous tubes': 'lactifers_tanniferous_tubes', 'New Caledonia': 'new_caledonia', 'NOTES': 'notes', 'parenchyma like fibres present': 'parenchyma_like_fibres_present', 'perforation plates types': 'perforation_plates_types', 'prismatic crystal': 'prismatic_crystal', 'radial secretory canals': 'radial_secretory_canals', 'radial tracheids for gymnosperms': 'radial_tracheids_for_gymnosperms', 'rays': 'rays', 'rays cellular composition': 'rays_cellular_composition', 'rays height': 'rays_height', 'rays sheat cells': 'rays_sheat_cells', 'RAYS STRUCTURE': 'rays_structure', 'rays width': 'rays_width', 'Reference Specimens': 'reference_specimens', 'silica': 'silica', 'solitary vessels with angular outline': 'solitary_vessels_with_angular_outline', 'Species': 'species', 'spetate fibres present': 'spetate_fibres_present', 'storied structure': 'storied_structure', 'tile cells': 'tile_cells', 'Turkey': 'turkey', 'vascular-vasicentric tracheids present': 'vascularvasicentric_tracheids_present', 'vessels': 'vessels', 'vessels arrangment': 'vessels_arrangment', 'vessels deposits': 'vessels_deposits', 'vessels grouping': 'vessels_grouping', 'vessels porosity': 'vessels_porosity', 'vessels rays pitting': 'vessels_rays_pitting', 'vessels tyloses': 'vessels_tyloses', 'walls': 'walls', 'Contributor': 'contributor', 'DATE': 'date', }) def link(accession, wood_details): wood_details.accession = accession wood_details.save() bi.add_linking_function(link) return bi