summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorDaniel Wiesmann <daniel.wiesmann@gmail.com>2016-01-22 11:03:05 +0000
committerClaude Paroz <claude@2xlibre.net>2016-01-22 19:38:34 +0100
commita08d2463d2674b95f5a995f77cd9596168378a4f (patch)
tree0f3d36935ba125847311ab10fe3b5e16d6d8ff30 /django
parent16baec5c8a24ea4bf1bfc27a4c8fea7d0ff4860f (diff)
Fixed #26112 -- Error when computing aggregate of GIS areas.
Thanks Simon Charette and Claude Paroz for the reviews.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/gis/db/models/functions.py25
-rw-r--r--django/contrib/gis/db/models/sql/conversion.py5
2 files changed, 15 insertions, 15 deletions
diff --git a/django/contrib/gis/db/models/functions.py b/django/contrib/gis/db/models/functions.py
index 17847bdc5c..4f76c155f2 100644
--- a/django/contrib/gis/db/models/functions.py
+++ b/django/contrib/gis/db/models/functions.py
@@ -117,24 +117,23 @@ class OracleToleranceMixin(object):
class Area(OracleToleranceMixin, GeoFunc):
+ output_field_class = AreaField
arity = 1
def as_sql(self, compiler, connection):
if connection.ops.geography:
- # Geography fields support area calculation, returns square meters.
- self.output_field = AreaField('sq_m')
- elif not self.output_field.geodetic(connection):
- # Getting the area units of the geographic field.
- units = self.output_field.units_name(connection)
- if units:
- self.output_field = AreaField(
- AreaMeasure.unit_attname(self.output_field.units_name(connection))
- )
- else:
- self.output_field = FloatField()
+ self.output_field.area_att = 'sq_m'
else:
- # TODO: Do we want to support raw number areas for geodetic fields?
- raise NotImplementedError('Area on geodetic coordinate systems not supported.')
+ # Getting the area units of the geographic field.
+ source_fields = self.get_source_fields()
+ if len(source_fields):
+ source_field = source_fields[0]
+ if source_field.geodetic(connection):
+ # TODO: Do we want to support raw number areas for geodetic fields?
+ raise NotImplementedError('Area on geodetic coordinate systems not supported.')
+ units_name = source_field.units_name(connection)
+ if units_name:
+ self.output_field.area_att = AreaMeasure.unit_attname(units_name)
return super(Area, self).as_sql(compiler, connection)
def as_oracle(self, compiler, connection):
diff --git a/django/contrib/gis/db/models/sql/conversion.py b/django/contrib/gis/db/models/sql/conversion.py
index dbbdb8b338..afc1053790 100644
--- a/django/contrib/gis/db/models/sql/conversion.py
+++ b/django/contrib/gis/db/models/sql/conversion.py
@@ -21,13 +21,14 @@ class BaseField(object):
class AreaField(BaseField):
"Wrapper for Area values."
- def __init__(self, area_att):
+ def __init__(self, area_att=None):
self.area_att = area_att
def from_db_value(self, value, expression, connection, context):
if connection.features.interprets_empty_strings_as_nulls and value == '':
value = None
- if value is not None:
+ # If the units are known, convert value into area measure.
+ if value is not None and self.area_att:
value = Area(**{self.area_att: value})
return value