def test_get_display_value_no_unit_conversion_when_same_units(self): set_attr_on_json_field( self.instance, 'config.value_display.test.unit_only.units', 'ft') val, display_val = get_display_value( self.instance, 'test', 'unit_only', 1) self.assertEqual(val, 1) self.assertEqual(display_val, '1.0')
def test_get_display_value_conversion(self): set_attr_on_json_field( self.instance, 'config.value_display.test.both.units', 'in') val, display_val = get_display_value( self.instance, 'test', 'both', 1) self.assertAlmostEqual(val, 12) self.assertEqual(display_val, '12.000')
def test_save_does_not_convert_diameter_when_units_same(self): set_attr_on_json_field(self.instance, "config.value_display.tree.diameter.units", "in") self.tree.diameter = 1 self.tree.save_with_user(self.user) updated_tree = Tree.objects.get(pk=self.tree.pk) self.assertEqual(1, updated_tree.diameter)
def test_save_does_not_convert_width_when_units_same(self): set_attr_on_json_field(self.instance, "config.value_display.plot.width.units", "ft") self.plot.width = 12 self.plot.save_with_user(self.user) updated_plot = Plot.objects.get(pk=self.plot.pk) self.assertEqual(12, updated_plot.width)
def test_uses_custom_units_and_digits(self): set_attr_on_json_field( self.instance, 'config.value_display.plot.length.units', 'm') set_attr_on_json_field( self.instance, 'config.value_display.plot.length.digits', '3') self.assert_plot_length_context_value( self.observer, 'field.display_value', '0.312 m')
def _update_instance_fields(json_data, instance, validation_fn=None): error_dict = {} for identifier, value in json_data.iteritems(): model, field_name = dotted_split(identifier, 2, maxsplit=1) obj = instance if validation_fn: errors = validation_fn(field_name, value, model) if errors is not None: error_dict[field_name] = errors if is_json_field_reference(field_name): set_attr_on_json_field(obj, field_name, value) else: setattr(obj, field_name, value) if error_dict: validation_error = ValidationError(error_dict) else: try: validate_is_public(instance) instance.save() return {'ok': True} except ValidationError, ve: validation_error = ve
def _update_instance_fields(json_data, instance, validation_fn=None, should_update_universal_rev=False): error_dict = {} for identifier, value in json_data.iteritems(): model, field_name = dotted_split(identifier, 2, maxsplit=1) obj = instance if validation_fn: errors = validation_fn(field_name, value, model) if errors is not None: error_dict[field_name] = errors if is_json_field_reference(field_name): set_attr_on_json_field(obj, field_name, value) else: setattr(obj, field_name, value) if error_dict: validation_error = ValidationError(error_dict) else: try: validate_is_public(instance) instance.save() if should_update_universal_rev: instance.update_universal_rev() return {'ok': True} except ValidationError, ve: validation_error = ve
def _validate_and_set_individual_values(json_data, instance, error_dict): errors = None INVALID_KEY_MESSAGE = _("An invalid key was sent in the request") for identifier, value in json_data.iteritems(): if not '.' in identifier: error_dict[identifier] = [INVALID_KEY_MESSAGE] __, field_name = dotted_split(identifier, 2, maxsplit=1) if not identifier.startswith('instance.config.'): error_dict[field_name] = [INVALID_KEY_MESSAGE] continue if field_name == 'config.annual_rainfall_inches': errors = _annual_rainfall_validator(value) if errors is None: _set_annual_rainfall(value, instance) elif field_name.startswith('config.map_feature_config'): errors = _map_feature_config_validator(field_name, value, instance) if errors is None: _set_map_feature_config(field_name, value, instance) elif field_name.startswith('config.terms'): errors = _terminology_validator(field_name, value, instance) if errors is None: set_attr_on_json_field(instance, field_name, value) else: errors = [INVALID_KEY_MESSAGE] if errors is not None: error_dict[field_name] = errors
def test_save_converts_width_when_units_differ(self): set_attr_on_json_field( self.instance, 'config.value_display.plot.width.units', 'in') self.plot.width = 12 self.plot.save_with_user(self.user) updated_plot = Plot.objects.get(pk=self.plot.pk) self.assertAlmostEqual(1, updated_plot.width)
def test_save_converts_diameter_when_units_differ(self): set_attr_on_json_field( self.instance, 'config.value_display.tree.diameter.units', 'ft') self.tree.diameter = 1 self.tree.save_with_user(self.user) updated_tree = Tree.objects.get(pk=self.tree.pk) self.assertAlmostEqual(12, updated_tree.diameter)
def test_save_does_not_convert_width_when_units_same(self): set_attr_on_json_field(self.instance, 'config.value_display.plot.width.units', 'ft') self.plot.width = 12 self.plot.save_with_user(self.user) updated_plot = Plot.objects.get(pk=self.plot.pk) self.assertEqual(12, updated_plot.width)
def test_save_does_not_convert_diameter_when_units_same(self): set_attr_on_json_field( self.instance, 'config.value_display.tree.diameter.units', 'in') self.tree.diameter = 1 self.tree.save_with_user(self.user) updated_tree = Tree.objects.get(pk=self.tree.pk) self.assertEqual(1, updated_tree.diameter)
def test_save_converts_width_when_units_differ(self): set_attr_on_json_field(self.instance, 'config.value_display.plot.width.units', 'in') self.plot.convert_to_display_units() self.plot.width = 12 self.plot.convert_to_database_units() self.plot.save_with_user(self.user) updated_plot = Plot.objects.get(pk=self.plot.pk) self.assertAlmostEqual(1, updated_plot.width)
def test_save_converts_diameter_when_units_differ(self): set_attr_on_json_field( self.instance, 'config.value_display.tree.diameter.units', 'ft') self.tree.convert_to_display_units() self.tree.diameter = 1 self.tree.convert_to_database_units() self.tree.save_with_user(self.user) updated_tree = Tree.objects.get(pk=self.tree.pk) self.assertAlmostEqual(12, updated_tree.diameter)
def test_unit_conversion(self): set_attr_on_json_field(self.instance, "config.value_display.tree.diameter.units", "cm") set_attr_on_json_field(self.instance, "config.value_display.tree.height.units", "m") self.instance.save() csv = """ | genus | common name | max diameter | max height | | g1 | wowza | 100 | 100 | """ ieid = self.run_through_commit_views(csv) ie = SpeciesImportEvent.objects.get(pk=ieid) species = ie.speciesimportrow_set.all()[0].species self.assertEqual(species.max_diameter, 254) # 100 in = 254 cm self.assertEqual(species.max_height, 30) # 100 ft = 30.48 m (rounded)
def test_diameter_units(self): p1, p2, p3, p4 = self.setup_diameter_test() filter = json.dumps({'tree.diameter': {'MAX': 9.0}}) plots = search.Filter(filter, '', self.instance)\ .get_objects(Plot) ids = {p.pk for p in plots} self.assertEqual(ids, {p1.pk, p2.pk, p3.pk, p4.pk}) set_attr_on_json_field(self.instance, 'config.value_display.tree.diameter.units', 'cm') self.instance.save() filter = json.dumps({'tree.diameter': {'MAX': 9.0}}) plots = search.Filter(filter, '', self.instance)\ .get_objects(Plot) ids = {p.pk for p in plots} # The filter range equates to 0 to 3.54. self.assertEqual(ids, {p1.pk}) # This is also testing the alternative range syntax filter = json.dumps({ 'tree.diameter': { 'MIN': { 'VALUE': 10, 'EXCLUSIVE': True }, 'MAX': { 'VALUE': 15.3, 'EXCLUSIVE': True } } }) plots = search.Filter(filter, '', self.instance)\ .get_objects(Plot) ids = {p.pk for p in plots} # The filter range equates to 3.93 to 6.02 inches self.assertEqual(ids, {p2.pk, p3.pk})
def test_unit_conversion(self): set_attr_on_json_field( self.instance, 'config.value_display.tree.diameter.units', 'cm') set_attr_on_json_field( self.instance, 'config.value_display.tree.height.units', 'm') self.instance.save() csv = """ | genus | common name | max diameter | max height | | g1 | wowza | 100 | 100 | """ ieid = self.run_through_commit_views(csv) ie = SpeciesImportEvent.objects.get(pk=ieid) species = ie.speciesimportrow_set.all()[0].species self.assertEqual(species.max_diameter, 254) # 100 in = 254 cm self.assertEqual(species.max_height, 30) # 100 ft = 30.48 m (rounded)
def test_water_barrel_specs(self): """ Rename Rain Barrel to Water Barrel, and make sure that is what units returns. """ instance = make_instance(url_name='test-waterbarrel') instance.add_map_feature_types(['RainBarrel']) set_attr_on_json_field(instance, 'config.terms.RainBarrel.singular', 'Water Barrel') specs = units(None, instance) value_specs = specs.get('value_specs') self.assertEqual(len(value_specs), 5) rain_barrel_spec = value_specs[3] self.assertEqual(rain_barrel_spec.get('title'), 'Water Barrel Fields')
def test_diameter_units(self): p1, p2, p3, p4 = self.setup_diameter_test() filter = json.dumps({'tree.diameter': {'MAX': 9.0}}) plots = search.Filter(filter, '', self.instance)\ .get_objects(Plot) ids = {p.pk for p in plots} self.assertEqual(ids, {p1.pk, p2.pk, p3.pk, p4.pk}) set_attr_on_json_field(self.instance, 'config.value_display.tree.diameter.units', 'cm') self.instance.save() filter = json.dumps({'tree.diameter': {'MAX': 9.0}}) plots = search.Filter(filter, '', self.instance)\ .get_objects(Plot) ids = {p.pk for p in plots} # The filter range equates to 0 to 3.54. self.assertEqual(ids, {p1.pk}) # This is also testing the alternative range syntax filter = json.dumps({'tree.diameter': {'MIN': {'VALUE': 10, 'EXCLUSIVE': True}, 'MAX': {'VALUE': 15.3, 'EXCLUSIVE': True}}}) plots = search.Filter(filter, '', self.instance)\ .get_objects(Plot) ids = {p.pk for p in plots} # The filter range equates to 3.93 to 6.02 inches self.assertEqual(ids, {p2.pk, p3.pk})
def _assert_set(self, model, field_name, value): set_attr_on_json_field(model, field_name, value) self._assert_get(model, field_name, value)
def test_get_storage_value(self): set_attr_on_json_field( self.instance, 'config.value_display.test.unit_only.units', 'in') self.assertAlmostEqual(1, get_storage_value(self.instance, 'test', 'unit_only', 12))
def test_get_display_value_no_unit_conversion_when_same_units(self): set_attr_on_json_field(self.instance, "config.value_display.test.unit_only.units", "ft") val, display_val = get_display_value(self.instance, "test", "unit_only", 1) self.assertEqual(val, 1) self.assertEqual(display_val, "1.0")
def test_get_display_value_conversion(self): set_attr_on_json_field(self.instance, "config.value_display.test.both.units", "in") val, display_val = get_display_value(self.instance, "test", "both", 1) self.assertAlmostEqual(val, 12) self.assertEqual(display_val, "12.000")
def test_get_storage_value(self): set_attr_on_json_field(self.instance, "config.value_display.test.unit_only.units", "in") self.assertAlmostEqual(1, get_storage_value(self.instance, "test", "unit_only", 12))
def test_uses_custom_units_and_digits(self): set_attr_on_json_field(self.instance, "config.value_display.plot.length.units", "m") set_attr_on_json_field(self.instance, "config.value_display.plot.length.digits", "3") self.assert_plot_length_context_value(self.observer, "field.display_value", "0.312 m")
def test_get_storage_value(self): set_attr_on_json_field(self.instance, 'config.value_display.test.unit_only.units', 'in') self.assertAlmostEqual( 1, get_storage_value(self.instance, 'test', 'unit_only', 12))