Skip to content

Commit

Permalink
Merge pull request #198 from ertush/dev
Browse files Browse the repository at this point in the history
Added sub county boundary validation
ertush authored Oct 25, 2024
2 parents 21de265 + ec39fec commit 5aea8df
Showing 3 changed files with 48 additions and 15 deletions.
6 changes: 6 additions & 0 deletions common/models/model_declarations.py
Original file line number Diff line number Diff line change
@@ -215,6 +215,12 @@ class SubCounty(AdministrativeUnitBase):
"""
county = models.ForeignKey(County, on_delete=models.PROTECT)

@property
def sub_county_bound(self):
from mfl_gis.models import SubCountyBoundary
unit = SubCountyBoundary.objects.filter(area=self)
return unit[0].bound if len(unit) else {}

def __str__(self):
return self.name

6 changes: 3 additions & 3 deletions facilities/filters/facility_filters.py
Original file line number Diff line number Diff line change
@@ -449,9 +449,9 @@ def filter_incomplete_facilities(self, qs, name, value):

all_facilities = qs.all()
if value in TRUTH_NESS:
# complete_facilities_ids = [facility.id for facility in all_facilities if facility.is_complete]
# return all_facilities.exclude(id__in=complete_facilities_ids)
return qs.filter(in_complete_details=not "")
complete_facilities_ids = [facility.id for facility in all_facilities if facility.is_complete]
return all_facilities.exclude(id__in=complete_facilities_ids)
# return qs.filter(is_complete=True)
else:
incomplete_facilities_ids = [facility.id for facility in all_facilities if not facility.is_complete]
return all_facilities.exclude(id__in=incomplete_facilities_ids)
51 changes: 39 additions & 12 deletions mfl_gis/models.py
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@
from django.contrib.gis.geos import MultiPolygon
from django.utils import timezone, encoding
from rest_framework.exceptions import ValidationError
from common.models import AbstractBase, County, Constituency, Ward
from common.models import AbstractBase, County, Constituency, SubCounty, Ward
from facilities.models import Facility


@@ -38,13 +38,13 @@ def _validate_within_boundaries(self, boundary_model, area, raise_not_found=True
try:
boundary = boundary_model.objects.get(area=area)
if not boundary.mpoly.contains(self.coordinates):
# raise ValidationError({
# "coordinates": [
# '({0}, {1}) not contained in boundary of {2}'.format(
# self.coordinates.x, self.coordinates.y, area
# )
# ]
# })
raise ValidationError({
"coordinates": [
'({0}, {1}) not contained in boundary of {2}'.format(
self.coordinates.x, self.coordinates.y, area
)
]
})
pass
else:
return True
@@ -57,8 +57,11 @@ def _validate_within_boundaries(self, boundary_model, area, raise_not_found=True
]
})

def validate_long_and_lat_within_constituency(self, constituency):
return self._validate_within_boundaries(ConstituencyBoundary, constituency)
# def validate_long_and_lat_within_constituency(self, constituency):
# return self._validate_within_boundaries(ConstituencyBoundary, constituency)
def validate_long_and_lat_within_sub_county(self, sub_county):
return self._validate_within_boundaries(SubCountyBoundary, sub_county)


def validate_long_and_lat_within_county(self, county):
return self._validate_within_boundaries(CountyBoundary, county)
@@ -208,8 +211,8 @@ def clean(self):
areas_passed += 1


if self.validate_long_and_lat_within_constituency(
self.facility.ward.constituency):
if self.validate_long_and_lat_within_sub_county(
self.facility.ward.sub_county):
areas_passed += 1

if self.validate_long_and_lat_within_ward(
@@ -412,6 +415,30 @@ class Meta(GISAbstractBase.Meta):
verbose_name_plural = 'constituency boundaries'


@reversion.register(follow=['area'])
@encoding.python_2_unicode_compatible
class SubCountyBoundary(AdministrativeUnitBoundary):
area = gis_models.OneToOneField(SubCounty)

def __str__(self):
return self.name

@property
def ward_ids(self):
return Ward.objects.filter(
sub_county=self.area).values_list('id', flat=True)

@property
def ward_boundary_ids(self):
ward_boundary_ids = WardBoundary.objects.filter(
area__id__in=self.ward_ids
).values_list('id', flat=True)
return ward_boundary_ids

class Meta(GISAbstractBase.Meta):
verbose_name_plural = 'sub_county boundaries'


@reversion.register(follow=['area'])
@encoding.python_2_unicode_compatible
class WardBoundary(AdministrativeUnitBoundary):

0 comments on commit 5aea8df

Please sign in to comment.