|
16 | 16 | Region, |
17 | 17 | Country, |
18 | 18 | District, |
| 19 | + Admin2, |
19 | 20 | CountryKeyFigure, |
20 | 21 | RegionKeyFigure, |
21 | 22 | CountrySnippet, |
|
52 | 53 | from notifications.models import Subscription |
53 | 54 |
|
54 | 55 |
|
| 56 | +class GeoSerializerMixin: |
| 57 | + ''' |
| 58 | + A mixin class to encapsulate common methods |
| 59 | + used across serializers that deal with geo objects. |
| 60 | + Will allow us to avoid repeating code to convert objects |
| 61 | + to GeoJSON, etc. |
| 62 | +
|
| 63 | + FIXME: use this base class for existing serializers using geo objects. |
| 64 | + FIXME: the methods can probably be thought through a bit better |
| 65 | + ''' |
| 66 | + def get_bbox(self, district): |
| 67 | + if district.bbox: |
| 68 | + return json.loads(district.bbox.geojson) |
| 69 | + else: |
| 70 | + return None |
| 71 | + |
| 72 | + def get_centroid(self, district): |
| 73 | + if district.centroid: |
| 74 | + return json.loads(district.centroid.geojson) |
| 75 | + else: |
| 76 | + return None |
| 77 | + |
55 | 78 | class DisasterTypeSerializer(ModelSerializer): |
56 | 79 | class Meta: |
57 | 80 | model = DisasterType |
@@ -185,13 +208,25 @@ class Meta: |
185 | 208 | fields = ('name', 'code', 'country', 'id', 'is_deprecated',) |
186 | 209 |
|
187 | 210 |
|
| 211 | + |
| 212 | + |
| 213 | +class Admin2Serializer(GeoSerializerMixin, ModelSerializer): |
| 214 | + bbox = serializers.SerializerMethodField() |
| 215 | + centroid = serializers.SerializerMethodField() |
| 216 | + district_id = serializers.IntegerField(source='admin1.id', read_only=True) |
| 217 | + |
| 218 | + class Meta: |
| 219 | + model = Admin2 |
| 220 | + fields = ('district_id', 'name', 'code', 'bbox', 'centroid',) |
| 221 | + |
| 222 | + |
188 | 223 | class MiniDistrictSerializer(ModelSerializer): |
189 | 224 | class Meta: |
190 | 225 | model = District |
191 | 226 | fields = ('name', 'code', 'id', 'is_enclave', 'is_deprecated',) |
192 | 227 |
|
193 | 228 |
|
194 | | -class MiniDistrictGeoSerializer(ModelSerializer): |
| 229 | +class MiniDistrictGeoSerializer(GeoSerializerMixin, ModelSerializer): |
195 | 230 | bbox = serializers.SerializerMethodField() |
196 | 231 | centroid = serializers.SerializerMethodField() |
197 | 232 | country_name = serializers.CharField(source='country.name', read_only=True) |
|
0 commit comments