Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dashboard rejetion creteria #30

Open
wants to merge 54 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
5d2c0e3
matierialized view update
benzerbett Oct 27, 2021
9935941
chul updates approval - error fix
benzerbett Nov 9, 2021
27c07d4
cleanup facility_filters code, started KHIS-Tracker sync feature (WiP)
benzerbett Jan 5, 2022
5a40f5a
revert tracker sync
benzerbett Jan 5, 2022
379310b
Create dev_requirements.txt
benzerbett Jan 14, 2022
f34cbad
add satellite blood bank to khis facility type mapping
SteveWaweru Feb 7, 2022
a1afaaa
get facility keph level count
abdimoha-dev Jun 2, 2022
1889501
Merge pull request #1 from uonafya/ft-reports-data
abdimoha-dev Jun 2, 2022
67735aa
keph level bug fixes
abdimoha-dev Jun 2, 2022
c50d85a
code cleaup
abdimoha-dev Jun 2, 2022
ca5d5c5
Merge pull request #2 from uonafya/ft-reports-data
abdimoha-dev Jun 2, 2022
c52244a
fix keph level bug
abdimoha-dev Jun 2, 2022
505445e
code cleanup
abdimoha-dev Jun 2, 2022
dca5049
code cleanup
abdimoha-dev Jun 2, 2022
2b900ac
bed count per county
abdimoha-dev Jun 2, 2022
ecf0834
fetch bed per county
abdimoha-dev Jun 3, 2022
05eecfc
changed the format of result given
KorirC Jun 6, 2022
240aaec
user creation
KorirC Sep 11, 2022
67cc382
Create dev_requirements.txt
benzerbett Jan 14, 2022
3f8f6cf
add satellite blood bank to khis facility type mapping
SteveWaweru Feb 7, 2022
e1cc810
Modify: requirements.txt and config/settings/base.py
ertush May 17, 2022
eef575e
updated config/settings/base.py to match mfl_api_testing credentials
ertush Sep 11, 2022
3141465
modified config/settings/base.py
ertush Sep 13, 2022
97300c4
added support for infrastructure and infrastructure_category fields i…
ertush Oct 31, 2022
7f69048
added speciality and speciality category in the filter api
ertush Nov 1, 2022
2e3d9ab
Modified chul/views.py
ertush Dec 5, 2022
3b64f13
working in progress:line 236: facilities/views/facility_views.py
ertush Dec 9, 2022
f4ebf41
modified chus to accept basic_details update and facility_serializers.py
ertush Dec 14, 2022
f641712
modified facility_models.py by updating facility_infrastructure and f…
ertush Dec 28, 2022
b96446b
Merge pull request #3 from uonafya/fx-facility-models
ertush Dec 30, 2022
be2d065
updated config/settings/base.py
ertush Dec 30, 2022
ce4e0b7
Merge pull request #4 from uonafya/fx-config-settings
ertush Dec 30, 2022
212b899
modified facility_reports.py to support report_type filter by beds_an…
ertush Jan 3, 2023
29457de
Merge pull request #5 from uonafya/fx-facility-reports
ertush Jan 3, 2023
cf85fed
Fixed service_filter and added hr_filter, infrastructure_filter funct…
ertush Jan 16, 2023
408f3dd
Merge pull request #6 from uonafya/fx-facility-filters
ertush Jan 16, 2023
f461900
Fixed service_filter and added hr_filter, infrastructure_filter funct…
ertush Jan 16, 2023
e6cd08e
Restored reporting/facility_reports.py
ertush Jan 16, 2023
6b0fefe
Merge pull request #7 from uonafya/fx-facility-filters
ertush Jan 16, 2023
1882cb6
Fixed a bug in update_facility function of facility_models.py
ertush Jan 25, 2023
62c0700
Merge pull request #8 from uonafya/fx-facility-models
ertush Jan 25, 2023
0158a0a
updated kmhfl_dhis2_ownership_mapping in facilities/models/facility_m…
ertush Feb 4, 2023
9f5a8a7
updated kmhfl_dhis2_ownership_mapping in facilities/models/facility_m…
ertush Feb 4, 2023
4bb462e
Merge pull request #9 from uonafya/dev
ertush Feb 5, 2023
02f7c23
Modified facilities/utils.py; line 287
ertush Feb 7, 2023
f920154
added MEDICAL_CLINIC mapping to kmhfl_dhis2_facility_type_mapping in …
ertush Feb 22, 2023
1997d63
modified facilities dashboard to support filtering by sub_county and …
ertush Feb 28, 2023
f7c5c3c
Merge pull request #10 from uonafya/dev
ertush Feb 28, 2023
423b0c9
Added fiedl number_of_inpatient_beds in class Facility of facilities…
ertush Mar 2, 2023
6bd649f
Merge pull request #11 from uonafya/dev
ertush Mar 2, 2023
3f84be2
CHUL Endpoint Fix
Atieno-Ouma Mar 22, 2023
14c999e
Add CU summary dashboard
Atieno-Ouma Mar 29, 2023
2056d49
Facilty status summary
Atieno-Ouma Apr 3, 2023
bd9dba6
Rejected at Validation&Approval endpoint
Atieno-Ouma Apr 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
modified facilities dashboard to support filtering by sub_county and …
…ward as well as fetch all the 47 county summary data
ertush committed Feb 28, 2023
commit 1997d63736822a5f3d54a23f078ecab1e1b8e333
2 changes: 2 additions & 0 deletions facilities/models/facility_models.py
Original file line number Diff line number Diff line change
@@ -1227,6 +1227,7 @@ def push_new_facility(self, code=None):
"8949eeb0-40b1-43d4-a38d-5d4933dc209f": "lTrpyOiOcM6",
"ccc1600e-9a24-499f-889f-bd9f0bdc4b95": "YQK9pleIoeB",
"d8d741b1-21c5-45c8-86d0-a2094bf9bda6": "YQK9pleIoeB",
"85f2099b-a2f8-49f4-9798-0cb48c0875ff": "YQK9pleIoeB",
"869118aa-0e97-4f47-b6b7-1f295d109c8f": "YQK9pleIoeB",
"a8af148f-b1b6-4eed-9d86-07d4f3135229": "YQK9pleIoeB",
"74755372-99ba-4b70-bca8-a583f03990bc": "lTrpyOiOcM6",
@@ -1246,6 +1247,7 @@ def push_new_facility(self, code=None):
"188551b7-4f22-4fc4-b07b-f9c9aeeea872": "rhKJPLo27x7",
"e5923a48-6b22-42c4-a4e6-6c5a5e8e0b0e": "YQK9pleIoeB",
"55d65dd6-5351-4cf4-a6d9-e05ce6d343ab": "mVrepdLAqSD",
"87626d3d-fd19-49d9-98da-daca4afe85bf": "mVrepdLAqSD",
"79158397-0d87-4d0e-8694-ad680a907a79": "YQK9pleIoeB",
"031293d9-fd8a-4682-a91e-a4390d57b0cf": "YQK9pleIoeB",
"4369eec8-0416-4e16-b013-e635ce46a02f": "YQK9pleIoeB",
6 changes: 5 additions & 1 deletion facilities/urls/facility_urls.py
Original file line number Diff line number Diff line change
@@ -84,7 +84,11 @@
views.FacilityOfficerDetailView.as_view(),
name='facility_officer_detail'),

url(r'^dashboard/$', views.DashBoard.as_view(), name='dashboard'),
url(r'^dashboard/$', views.DashBoard.as_view(),
name='dashboard'),
# url(r'^dashboard/(?P<pk>[^/]+)/$', views.DashBoard.as_view(),
# name='dashboard'),


url(r'^facility_correction_template/(?P<pk>[^/]+)/$',
views.FacilityCorrectionTemplate.as_view(),
223 changes: 161 additions & 62 deletions facilities/views/facility_dashboard.py
Original file line number Diff line number Diff line change
@@ -49,7 +49,7 @@ def get_facility_county_summary(self):
facility_county_summary[str(county.name)] = facility_county_count
top_10_counties = sorted(
facility_county_summary.items(),
key=lambda x: x[1], reverse=True)[0:20]
key=lambda x: x[1], reverse=True)[0:94]
facility_county_summary
top_10_counties_summary = []
for item in top_10_counties:
@@ -64,11 +64,16 @@ def get_facility_county_summary(self):
return top_10_counties_summary if self.request.user.is_national else []

def get_facility_constituency_summary(self):
constituencies = SubCounty.objects.filter(
county=self.request.user.county)
constituencies = constituencies if self.request.user.county else []
if not self.request.query_params.get('sub_county'):
constituencies = SubCounty.objects.filter(
county=self.request.user.county) \
if not self.request.query_params.get('ward') and self.request.user.county else []

else:
constituencies = [SubCounty.objects.get(id=self.request.query_params.get('sub_county'))]

facility_constituency_summary = {}

for const in constituencies:
facility_const_count = self.get_queryset().filter(
ward__sub_county=const).count()
@@ -90,10 +95,18 @@ def get_facility_constituency_summary(self):
})
return top_10_consts_summary


def get_facility_ward_summary(self):
wards = Ward.objects.filter(

if not self.request.query_params.get('ward'):
wards = Ward.objects.filter(
sub_county=self.request.user.sub_county) \
if self.request.user.sub_county else []

else:
wards = [Ward.objects.get(id=self.request.query_params.get('ward'))]


facility_ward_summary = {}
for ward in wards:
facility_ward_count = self.get_queryset().filter(
@@ -115,6 +128,7 @@ def get_facility_ward_summary(self):
})
return top_10_wards_summary


def get_facility_type_summary(self, cty):
facility_type_parents_names = []
for f_type in FacilityType.objects.all():
@@ -130,13 +144,20 @@ def get_facility_type_summary(self, cty):
summaries[parent] = 0

for facility_type in facility_types:
if not cty:
summaries[facility_type.sub_division] = summaries.get(
facility_type.sub_division) + self.get_queryset().filter(
facility_type=facility_type).count()
if not cty and not self.request.query_params.get('sub_county'):

summaries[facility_type.sub_division] = summaries.get(
facility_type.sub_division) + self.get_queryset().filter(
facility_type=facility_type).count()
else:
summaries[facility_type.sub_division] = self.get_queryset().filter(
facility_type=facility_type, ward__sub_county__county=cty).count()
if not self.request.query_params.get('ward'):
summaries[facility_type.sub_division] = self.get_queryset().filter(
facility_type=facility_type, ward__sub_county__county=cty, sub_county=self.request.query_params.get('sub_county')).count()
else:
summaries[facility_type.sub_division] = self.get_queryset().filter(
facility_type=facility_type, ward__sub_county__county=cty, ward=self.request.query_params.get('ward')).count()



facility_type_summary = [
{"name": key, "count": value } for key, value in summaries.items()
@@ -150,65 +171,95 @@ def get_facility_type_summary(self, cty):

def get_facility_owner_summary(self, cty):
owners = Owner.objects.all()

facility_owners_summary = []
for owner in owners:
if not cty:
if not cty and not self.request.query_params.get('sub_county'):
facility_owners_summary.append(
{
"name": owner.name,
"count": self.get_queryset().filter(
owner=owner).count()
})
else:
facility_owners_summary.append(
if not self.request.query_params.get('ward'):
facility_owners_summary.append(
{
"name": owner.name,
"count": self.get_queryset().filter(
ward__sub_county__county=cty, owner=owner, sub_county=self.request.query_params.get('sub_county')).count()
})
else:
facility_owners_summary.append(
{
"name": owner.name,
"count": self.get_queryset().filter(
ward__sub_county__county=cty, owner=owner).count()
ward__sub_county__county=cty, owner=owner, ward=self.request.query_params.get('ward')).count()
})

return facility_owners_summary


def get_facility_status_summary(self, cty):
statuses = FacilityStatus.objects.all()
status_summary = []
for status in statuses:
if not cty:
if not cty and not self.request.query_params.get('sub_county'):
status_summary.append(
{
"name": status.name,
"count": self.get_queryset().filter(
operation_status=status).count()
})
else:
status_summary.append(
{
"name": status.name,
"count": self.get_queryset().filter(
ward__sub_county__county=cty,
operation_status=status).count()
})
if not self.request.query_params.get('ward'):
status_summary.append(
{
"name": status.name,
"count": self.get_queryset().filter(
ward__sub_county__county=cty,
operation_status=status, sub_county=self.request.query_params.get('sub_county')).count()
})
else:
status_summary.append(
{
"name": status.name,
"count": self.get_queryset().filter(
ward__sub_county__county=cty,
operation_status=status, ward=self.request.query_params.get('ward')).count()
})

return status_summary

def get_facility_owner_types_summary(self, cty):
owner_types = OwnerType.objects.all()
owner_types_summary = []
for owner_type in owner_types:
if not cty:
if not cty and not self.request.query_params.get('sub_county'):
owner_types_summary.append(
{
"name": owner_type.name,
"count": self.get_queryset().filter(
owner__owner_type=owner_type).count()
})
else:
owner_types_summary.append(
{
"name": owner_type.name,
"count": self.get_queryset().filter(
ward__sub_county__county=cty,
owner__owner_type=owner_type).count()
})
if not self.request.query_params.get('ward'):
owner_types_summary.append(
{
"name": owner_type.name,
"count": self.get_queryset().filter(
ward__sub_county__county=cty,
owner__owner_type=owner_type, sub_county=self.request.query_params.get('sub_county')).count()
})
else:
owner_types_summary.append(
{
"name": owner_type.name,
"count": self.get_queryset().filter(
ward__sub_county__county=cty,
owner__owner_type=owner_type, ward=self.request.query_params.get('ward')).count()
})


return owner_types_summary

@@ -314,62 +365,95 @@ def get_recently_created_chus(self, cty):


def facilities_pending_approval_count(self, cty):
if not cty:
if not cty and not self.request.query_params.get('sub_county'):
updated_pending_approval = self.get_queryset().filter(has_edits=True)
newly_created = self.queryset.filter(approved=False, rejected=False)
else:
updated_pending_approval = self.get_queryset().filter(
ward__sub_county__county=cty, has_edits=True)
newly_created = self.queryset.filter(
ward__sub_county__county=cty, approved=False, rejected=False)
if not self.request.query_params.get('ward'):
updated_pending_approval = self.get_queryset().filter(
ward__sub_county__county=cty, sub_county=self.request.query_params.get('sub_county'), has_edits=True)
newly_created = self.queryset.filter(
ward__sub_county__county=cty, sub_county=self.request.query_params.get('sub_county'), approved=False, rejected=False)
else:
updated_pending_approval = self.get_queryset().filter(
ward__sub_county__county=cty, ward=self.request.query_params.get('ward'), has_edits=True)
newly_created = self.queryset.filter(
ward__sub_county__county=cty, ward=self.request.query_params.get('ward'), approved=False, rejected=False)

return len(
list(set(list(updated_pending_approval) + list(newly_created)))
)

def get_facilities_approved_count(self,cty):
if not cty:
if not cty and not self.request.query_params.get('sub_county'):
return self.queryset.filter(approved=True, rejected=False).count()
else:
return self.queryset.filter(approved=True, rejected=False, ward__sub_county__county=cty).count()
if not self.request.query_params.get('ward'):
return self.queryset.filter(approved=True, rejected=False, ward__sub_county__county=cty, sub_county=self.request.query_params.get('sub_county')).count()
else:
return self.queryset.filter(approved=True, rejected=False, ward__sub_county__county=cty, ward=self.request.query_params.get('ward')).count()


def get_chus_pending_approval(self, cty):
"""
Get the number of CHUs pending approval
"""
if not cty:
if not cty and not self.request.query_params.get('sub_county'):
return CommunityHealthUnit.objects.filter(
Q(is_approved=False, is_rejected=False) |
Q(has_edits=True)).distinct().filter(
facility__in=self.get_queryset()).count()
else:
return CommunityHealthUnit.objects.filter(
Q(is_approved=False, is_rejected=False) |
Q(has_edits=True)).distinct().filter(
facility__in=self.get_queryset(),
facility__ward__sub_county__county=cty).count()
if not self.request.query_params.get('ward'):
return CommunityHealthUnit.objects.filter(
Q(is_approved=False, is_rejected=False) |
Q(has_edits=True)).distinct().filter(
facility__in=self.get_queryset(),
facility__ward__sub_county__county=cty, facility__ward__sub_county=self.request.query_params.get('sub_county')).count()
else:
return CommunityHealthUnit.objects.filter(
Q(is_approved=False, is_rejected=False) |
Q(has_edits=True)).distinct().filter(
facility__in=self.get_queryset(),
facility__ward__sub_county__county=cty, facility__ward=self.request.query_params.get('ward')).count()


def get_rejected_chus(self, cty):
"""
Get the number of CHUs that have been rejected
"""
if not cty:
if not cty and not self.request.query_params.get('sub_county'):
return CommunityHealthUnit.objects.filter(is_rejected=True).count()
else:
return CommunityHealthUnit.objects.filter(
is_rejected=True,
facility__ward__sub_county__county=cty).count()
if not self.request.query_params.get('ward'):
return CommunityHealthUnit.objects.filter(
is_rejected=True,
facility__ward__sub_county__county=cty, facility__ward__sub_county=self.request.query_params.get('sub_county')).count()
else:
return CommunityHealthUnit.objects.filter(
is_rejected=True,
facility__ward__sub_county__county=cty, facility__ward=self.request.query_params.get('ward')).count()


def get_rejected_facilities_count(self, cty):
if not cty:
if not cty and not self.request.query_params.get('sub_county'):
return self.get_queryset().filter(rejected=True).count()
else:
return self.get_queryset().filter(rejected=True, ward__sub_county__county=cty).count()
if not self.request.query_params.get('ward'):
return self.get_queryset().filter(rejected=True, ward__sub_county__county=cty, sub_county=self.request.query_params.get('sub_county')).count()
else:
return self.get_queryset().filter(rejected=True, ward__sub_county__county=cty, ward=self.request.query_params.get('ward')).count()


def get_closed_facilities_count(self, cty):
if not cty:
if not cty and not self.request.query_params.get('sub_county'):
return self.get_queryset().filter(closed=True).count()
else:
return self.get_queryset().filter(closed=True, ward__sub_county__county=cty).count()
if not self.request.query_params.get('ward'):
return self.get_queryset().filter(closed=True, ward__sub_county__county=cty, sub_county=self.request.query_params.get('sub_county')).count()
else:
return self.get_queryset().filter(closed=True, ward__sub_county__county=cty, ward=self.request.query_params.get('ward')).count()


def get_facilities_kephlevel_count(self,county_name):
"""
@@ -394,33 +478,48 @@ def get_facilities_kephlevel_count(self,county_name):


def get(self, *args, **kwargs):

user = self.request.user
county_ = user.county

if not self.request.query_params.get('county'):
county_ = user.county
else:
county_ = County.objects.get(id=self.request.query_params.get('county'))
if not county_:
if not county_ and not self.request.query_params.get('sub_county'):

total_facilities = self.get_queryset().count()
else:
total_facilities = self.get_queryset().filter(
ward__sub_county__county=county_).count()
if not county_:
if not self.request.query_params.get('ward'):

total_facilities = self.get_queryset().filter(
ward__sub_county__county=county_, ward__sub_county=self.request.query_params.get('sub_county')).count()
else:

total_facilities = self.get_queryset().filter(
ward__sub_county__county=county_, ward=self.request.query_params.get('ward')).count()

if not county_ and not self.request.query_params.get('sub_county'):
total_chus = CommunityHealthUnit.objects.filter(
facility__in=self.get_queryset()).count()
else:
total_chus = CommunityHealthUnit.objects.filter(
facility__in=self.get_queryset().filter(
ward__sub_county__county=county_)).count()
if not self.request.query_params.get('ward'):
total_chus = CommunityHealthUnit.objects.filter(
facility__in=self.get_queryset().filter(
ward__sub_county__county=county_, ward__sub_county=self.request.query_params.get('sub_county'))).count()
else:
total_chus = CommunityHealthUnit.objects.filter(
facility__in=self.get_queryset().filter(
ward__sub_county__county=county_, ward=self.request.query_params.get('ward'))).count()
data = {
"keph_level" : self.get_facilities_kephlevel_count(county_),
"total_facilities": total_facilities,
"county_summary": self.get_facility_county_summary()
if user.is_national else [],
"constituencies_summary": self.get_facility_constituency_summary()
if user.county and not user.sub_county else [],
"wards_summary": self.get_facility_ward_summary()
if user.sub_county else [],
"constituencies_summary": self.get_facility_constituency_summary(),
# if user.county and not user.sub_county else [],
"wards_summary": self.get_facility_ward_summary(),
# if user.sub_county else [],
"owners_summary": self.get_facility_owner_summary(county_),
"types_summary": self.get_facility_type_summary(county_),
"status_summary": self.get_facility_status_summary(county_),