Fix setting Geo Location fields (#488)
This commit is contained in:
		| @@ -4,7 +4,8 @@ Changelog | |||||||
|  |  | ||||||
| Changes in 0.8.5 | Changes in 0.8.5 | ||||||
| ================ | ================ | ||||||
| - Fix testing invalid dict field value (#485) | - Fix setting Geo Location fields (#488) | ||||||
|  | - Fix handling invalid dict field value (#485) | ||||||
| - Added app_label to MongoUser (#484) | - Added app_label to MongoUser (#484) | ||||||
| - Use defaults when host and port are passed as None (#483) | - Use defaults when host and port are passed as None (#483) | ||||||
| - Fixed distinct casting issue with ListField of EmbeddedDocuments (#470) | - Fixed distinct casting issue with ListField of EmbeddedDocuments (#470) | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ def _import_class(cls_name): | |||||||
|                      'GenericEmbeddedDocumentField', 'GeoPointField', |                      'GenericEmbeddedDocumentField', 'GeoPointField', | ||||||
|                      'PointField', 'LineStringField', 'ListField', |                      'PointField', 'LineStringField', 'ListField', | ||||||
|                      'PolygonField', 'ReferenceField', 'StringField', |                      'PolygonField', 'ReferenceField', 'StringField', | ||||||
|                      'ComplexBaseField') |                      'ComplexBaseField', 'GeoJsonBaseField') | ||||||
|     queryset_classes = ('OperationError',) |     queryset_classes = ('OperationError',) | ||||||
|     deref_classes = ('DeReference',) |     deref_classes = ('DeReference',) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -42,7 +42,8 @@ __all__ = ['StringField',  'URLField',  'EmailField',  'IntField',  'LongField', | |||||||
|            'GenericReferenceField',  'BinaryField',  'GridFSError', |            'GenericReferenceField',  'BinaryField',  'GridFSError', | ||||||
|            'GridFSProxy',  'FileField',  'ImageGridFsProxy', |            'GridFSProxy',  'FileField',  'ImageGridFsProxy', | ||||||
|            'ImproperlyConfigured',  'ImageField',  'GeoPointField', 'PointField', |            'ImproperlyConfigured',  'ImageField',  'GeoPointField', 'PointField', | ||||||
|            'LineStringField', 'PolygonField', 'SequenceField',  'UUIDField'] |            'LineStringField', 'PolygonField', 'SequenceField',  'UUIDField', | ||||||
|  |            'GeoJsonBaseField'] | ||||||
|  |  | ||||||
|  |  | ||||||
| RECURSIVE_REFERENCE_CONSTANT = 'self' | RECURSIVE_REFERENCE_CONSTANT = 'self' | ||||||
|   | |||||||
| @@ -206,6 +206,10 @@ def update(_doc_cls=None, **update): | |||||||
|             else: |             else: | ||||||
|                 field = cleaned_fields[-1] |                 field = cleaned_fields[-1] | ||||||
|  |  | ||||||
|  |             GeoJsonBaseField = _import_class("GeoJsonBaseField") | ||||||
|  |             if isinstance(field, GeoJsonBaseField): | ||||||
|  |                 value = field.to_mongo(value) | ||||||
|  |  | ||||||
|             if op in (None, 'set', 'push', 'pull'): |             if op in (None, 'set', 'push', 'pull'): | ||||||
|                 if field.required or value is not None: |                 if field.required or value is not None: | ||||||
|                     value = field.prepare_query_value(op, value) |                     value = field.prepare_query_value(op, value) | ||||||
|   | |||||||
| @@ -414,5 +414,47 @@ class GeoQueriesTest(unittest.TestCase): | |||||||
|         roads = Road.objects.filter(poly__geo_intersects={"$geometry": polygon}).count() |         roads = Road.objects.filter(poly__geo_intersects={"$geometry": polygon}).count() | ||||||
|         self.assertEqual(1, roads) |         self.assertEqual(1, roads) | ||||||
|  |  | ||||||
|  |     def test_2dsphere_point_sets_correctly(self): | ||||||
|  |         class Location(Document): | ||||||
|  |             loc = PointField() | ||||||
|  |  | ||||||
|  |         Location.drop_collection() | ||||||
|  |  | ||||||
|  |         Location(loc=[1,2]).save() | ||||||
|  |         loc = Location.objects.as_pymongo()[0] | ||||||
|  |         self.assertEquals(loc["loc"], {"type": "Point", "coordinates": [1, 2]}) | ||||||
|  |  | ||||||
|  |         Location.objects.update(set__loc=[2,1]) | ||||||
|  |         loc = Location.objects.as_pymongo()[0] | ||||||
|  |         self.assertEquals(loc["loc"], {"type": "Point", "coordinates": [2, 1]}) | ||||||
|  |  | ||||||
|  |     def test_2dsphere_linestring_sets_correctly(self): | ||||||
|  |         class Location(Document): | ||||||
|  |             line = LineStringField() | ||||||
|  |  | ||||||
|  |         Location.drop_collection() | ||||||
|  |  | ||||||
|  |         Location(line=[[1, 2], [2, 2]]).save() | ||||||
|  |         loc = Location.objects.as_pymongo()[0] | ||||||
|  |         self.assertEquals(loc["line"], {"type": "LineString", "coordinates": [[1, 2], [2, 2]]}) | ||||||
|  |  | ||||||
|  |         Location.objects.update(set__line=[[2, 1], [1, 2]]) | ||||||
|  |         loc = Location.objects.as_pymongo()[0] | ||||||
|  |         self.assertEquals(loc["line"], {"type": "LineString", "coordinates": [[2, 1], [1, 2]]}) | ||||||
|  |  | ||||||
|  |     def test_geojson_PolygonField(self): | ||||||
|  |         class Location(Document): | ||||||
|  |             poly = PolygonField() | ||||||
|  |  | ||||||
|  |         Location.drop_collection() | ||||||
|  |  | ||||||
|  |         Location(poly=[[[40, 5], [40, 6], [41, 6], [40, 5]]]).save() | ||||||
|  |         loc = Location.objects.as_pymongo()[0] | ||||||
|  |         self.assertEquals(loc["poly"], {"type": "Polygon", "coordinates": [[[40, 5], [40, 6], [41, 6], [40, 5]]]}) | ||||||
|  |  | ||||||
|  |         Location.objects.update(set__poly=[[[40, 4], [40, 6], [41, 6], [40, 4]]]) | ||||||
|  |         loc = Location.objects.as_pymongo()[0] | ||||||
|  |         self.assertEquals(loc["poly"], {"type": "Polygon", "coordinates": [[[40, 4], [40, 6], [41, 6], [40, 4]]]}) | ||||||
|  |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     unittest.main() |     unittest.main() | ||||||
|   | |||||||
| @@ -167,6 +167,35 @@ class TransformTest(unittest.TestCase): | |||||||
|                              {'attachments.views.extracted': 'no'}]} |                              {'attachments.views.extracted': 'no'}]} | ||||||
|         self.assertEqual(expected, raw_query) |         self.assertEqual(expected, raw_query) | ||||||
|  |  | ||||||
|  |     def test_geojson_PointField(self): | ||||||
|  |         class Location(Document): | ||||||
|  |             loc = PointField() | ||||||
|  |  | ||||||
|  |         update = transform.update(Location, set__loc=[1, 2]) | ||||||
|  |         self.assertEquals(update, {'$set': {'loc': {"type": "Point", "coordinates": [1,2]}}}) | ||||||
|  |  | ||||||
|  |         update = transform.update(Location, set__loc={"type": "Point", "coordinates": [1,2]}) | ||||||
|  |         self.assertEquals(update, {'$set': {'loc': {"type": "Point", "coordinates": [1,2]}}}) | ||||||
|  |  | ||||||
|  |     def test_geojson_LineStringField(self): | ||||||
|  |         class Location(Document): | ||||||
|  |             line = LineStringField() | ||||||
|  |  | ||||||
|  |         update = transform.update(Location, set__line=[[1, 2], [2, 2]]) | ||||||
|  |         self.assertEquals(update, {'$set': {'line': {"type": "LineString", "coordinates": [[1, 2], [2, 2]]}}}) | ||||||
|  |  | ||||||
|  |         update = transform.update(Location, set__line={"type": "LineString", "coordinates": [[1, 2], [2, 2]]}) | ||||||
|  |         self.assertEquals(update, {'$set': {'line': {"type": "LineString", "coordinates": [[1, 2], [2, 2]]}}}) | ||||||
|  |  | ||||||
|  |     def test_geojson_PolygonField(self): | ||||||
|  |         class Location(Document): | ||||||
|  |             poly = PolygonField() | ||||||
|  |  | ||||||
|  |         update = transform.update(Location, set__poly=[[[40, 5], [40, 6], [41, 6], [40, 5]]]) | ||||||
|  |         self.assertEquals(update, {'$set': {'poly': {"type": "Polygon", "coordinates": [[[40, 5], [40, 6], [41, 6], [40, 5]]]}}}) | ||||||
|  |  | ||||||
|  |         update = transform.update(Location, set__poly={"type": "Polygon", "coordinates": [[[40, 5], [40, 6], [41, 6], [40, 5]]]}) | ||||||
|  |         self.assertEquals(update, {'$set': {'poly': {"type": "Polygon", "coordinates": [[[40, 5], [40, 6], [41, 6], [40, 5]]]}}}) | ||||||
|  |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     unittest.main() |     unittest.main() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user