diff --git a/common/models/model_declarations.py b/common/models/model_declarations.py index c6a0ccef..9278da2b 100755 --- a/common/models/model_declarations.py +++ b/common/models/model_declarations.py @@ -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 diff --git a/facilities/filters/facility_filters.py b/facilities/filters/facility_filters.py index 0636a411..263d7b50 100755 --- a/facilities/filters/facility_filters.py +++ b/facilities/filters/facility_filters.py @@ -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) diff --git a/mfl_gis/models.py b/mfl_gis/models.py index 28494d55..ed58a461 100755 --- a/mfl_gis/models.py +++ b/mfl_gis/models.py @@ -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):