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
Show file tree
Hide file tree
Changes from all commits
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
5 changes: 4 additions & 1 deletion .env-example
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,7 @@ DATABASE_URL='postgres://mfl_testing:mfl_testing@localhost:5432/mfl_testing'
FRONTEND_URL='http://localhost:8062'
REALTIME_INDEX = true
HTTPS_ENABLED = false
ALLOWED_HOSTS=".localhost, .health.go.ke"
ALLOWED_HOSTS=".localhost, .health.go.ke"

# Toggle synchronization of the facilities to KHIS Tracker
PUSH_TO_TRACKER=false
15 changes: 7 additions & 8 deletions after_disaster_scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,13 @@ def load_wards_and_sub_counties_json_file():
try:
county_obj = County.objects.get(name__contains=county_name)
except:
import pdb
pdb.set_trace()

try:
constituency_obj = Constituency.objects.get(
name=constituency_name, county=county_obj)
except:
import pdb
pdb.set_trace()


try:
sub = SubCounty.objects.get(
name=sub_county_name.lower(), county=county_obj)
Expand All @@ -105,8 +104,8 @@ def load_wards_and_sub_counties_json_file():
county_name, constituency_name,
sub_county_name, ward_name)
except:
import pdb
pdb.set_trace()




def delete_unwanted_facilities():
Expand All @@ -126,8 +125,8 @@ def delete_unwanted_facilities():
for fc in FacilityContact.everything.filter(facility=facility):
for con in Contact.objects.filter(contact=fc.contact):
con.delete()
import pdb
pdb.set_trace()


fc.delete()

for unit in FacilityUnit.objects.filter(facility=facility):
Expand Down
40 changes: 27 additions & 13 deletions chul/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,15 @@ def pending_updates(self):
return chu.updates
except ChuUpdateBuffer.DoesNotExist:
return {}
except ChuUpdateBuffer.MultipleObjectsReturned:

latest_chu = ChuUpdateBuffer.objects.filter(
is_approved=False,
is_rejected=False,
health_unit=self
).order_by('-updated').first()
return latest_chu.updates


@property
def latest_update(self):
Expand Down Expand Up @@ -283,6 +292,7 @@ def push_chu_to_dhis2(self):
},
"openingDate": self.date_operational.strftime("%Y-%m-%d"),
}

metadata_payload = {
"keph": 'axUnguN4QDh'
}
Expand Down Expand Up @@ -484,19 +494,23 @@ def validate_atleast_one_attribute_updated(self):
raise ValidationError({"__all__": ["Nothing was edited"]})

def update_basic_details(self):
basic_details = json.loads(self.basic)
if 'status' in basic_details:
basic_details['status_id'] = basic_details.get(
'status').get('status_id')
basic_details.pop('status')
if 'facility' in basic_details:
basic_details['facility_id'] = basic_details.get(
'facility').get('facility_id')
basic_details.pop('facility')

for key, value in basic_details.iteritems():
setattr(self.health_unit, key, value)
self.health_unit.save()
if self.basic:
basic_details = json.loads(self.basic)
if 'status' in basic_details:
basic_details['status_id'] = basic_details.get(
'status').get('status_id')
basic_details.pop('status')
if 'facility' in basic_details:
basic_details['facility_id'] = basic_details.get(
'facility').get('facility_id')
basic_details.pop('facility')


for key, value in basic_details.iteritems():
setattr(self.health_unit, key, value)
if 'basic' in basic_details:
setattr(self.health_unit, 'facility_id', basic_details.get('basic').get('facility'))
self.health_unit.save()

def update_workers(self):
chews = json.loads(self.workers)
Expand Down
5 changes: 5 additions & 0 deletions chul/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -341,3 +341,8 @@ class CHURatingSerializer(AbstractFieldsMixin, serializers.ModelSerializer):

class Meta(AbstractFieldsMixin.Meta):
model = CHURating
class ChulSummarySerializer(serializers.ModelSerializer):
# count=serializers.IntegerField()
class Meta:
model = None
fields = '__all__'
4 changes: 4 additions & 0 deletions chul/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@
url(r'^units/(?P<pk>[^/]+)/$',
views.CommunityHealthUnitDetailView.as_view(),
name='community_health_unit_detail'),
url(r'^summary/$',
views.CommunityHealthUnitSummaryView.as_view(),
name='community_health_unit_summary'),


url(r'^chu_ratings/$',
views.CHURatingListView.as_view(), name='chu_ratings'),
Expand Down
114 changes: 84 additions & 30 deletions chul/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
from django.http import JsonResponse
from django.template import loader, Context
from django.utils import timezone
from django.views.decorators.cache import never_cache
from rest_framework import generics
from django.db.models import Count
from django.db import connection
from django.apps import apps
from common.views import AuditableDetailViewMixin, DownloadPDFMixin
from common.models import UserConstituency, UserCounty, UserSubCounty
from .models import (
Expand All @@ -17,6 +21,7 @@

from .serializers import (
CommunityHealthUnitSerializer,
ChulSummarySerializer,
CommunityHealthWorkerSerializer,
CommunityHealthWorkerContactSerializer,
StatusSerializer,
Expand All @@ -40,61 +45,94 @@

class FilterCommunityUnitsMixin(object):

def get_queryset(self, *args, **kwargs):
custom_queryset = kwargs.pop('custom_queryset', None)
if hasattr(custom_queryset, 'count'):
self.queryset = custom_queryset

if not self.request.user.has_perm(
"facilities.view_unpublished_facilities"):
self.queryset = self.queryset.filter(facility__approved=True)

if not self.request.user.has_perm(
"chul.view_rejected_chus"):
self.queryset = self.queryset.filter(is_approved=True)

def filter_approved_chus(self):
if self.request.user.has_perm(
"chul.view_unapproved_facilities") \
is False and 'approved' in [
field.name for field in
self.queryset.model._meta.get_fields()]:

# filter both facilities and facilities materialized view
try:
self.queryset = self.queryset.filter(approved=True, operation_status__is_public_visible=True)
except:
self.queryset = self.queryset.filter(approved=True, is_public_visible=True)

def filter_rejected_chus(self):
if self.request.user.has_perm("chul.view_rejected_chus") \
is False and ('rejected' in [
field.name for field in
self.queryset.model._meta.get_fields()]):
self.queryset = self.queryset.filter(rejected=False)

def filter_for_national_users(self):
if self.request.user.is_national:
self.queryset = self.queryset


def filter_for_county_users(self):
if self.request.user.county:
self.queryset = self.queryset.filter(
facility__ward__constituency__county__in=[
uc.county for uc in UserCounty.objects.filter(
user=self.request.user)
])

if self.request.user.constituency:
def filter_for_sub_county_users(self):
if self.request.user.sub_county:
self.queryset = self.queryset.filter(
facility__ward__constituency__in=[
uc.constituency for uc in UserConstituency.objects.filter(
facility__ward__sub_county__in=[
us.sub_county for us in UserSubCounty.objects.filter(
user=self.request.user)
])

if self.request.user.sub_county:
def filter_for_consituency_users(self):
if self.request.user.constituency:
self.queryset = self.queryset.filter(
facility__ward__sub_county__in=[
us.sub_county for us in UserSubCounty.objects.filter(
facility__ward__constituency__in=[
uc.constituency for uc in UserConstituency.objects.filter(
user=self.request.user)
])



def get_queryset(self, *args, **kwargs):
custom_queryset = kwargs.pop('custom_queryset', None)
if hasattr(custom_queryset, 'count'):
self.queryset = custom_queryset

self.filter_for_county_users()
self.filter_for_consituency_users()
self.filter_for_sub_county_users()
self.filter_rejected_chus()

# if not self.request.user.has_perm(
# "facilities.view_unpublished_facilities"):
# self.queryset = self.queryset.filter(facility__approved=True)

# if not self.request.user.has_perm(
# "chul.view_rejected_chus"):
# self.queryset = self.queryset.filter(is_approved=True)

return self.queryset

def filter_queryset(self, queryset):
"""
Overridden in order to constrain search results to what a user should
see.
"""
if 'search' in self.request.query_params:
search_term = self.request.query_params.get('search')
if search_term.isdigit():
queryset = self.queryset.filter(code=search_term)
else:
queryset = super(
FilterCommunityUnitsMixin, self).filter_queryset(queryset)
else:
queryset = super(
FilterCommunityUnitsMixin, self).filter_queryset(queryset)

# if 'search' in self.request.query_params:
# search_term = self.request.query_params.get('search')
# if search_term.isdigit():
# queryset = self.queryset.filter(code=search_term)
# else:
# queryset = super(
# FilterCommunityUnitsMixin, self).filter_queryset(queryset)
# else:
# queryset = super(
# FilterCommunityUnitsMixin, self).filter_queryset(queryset)

queryset = super(FilterCommunityUnitsMixin, self).filter_queryset(queryset)
return self.get_queryset(custom_queryset=queryset)


Expand Down Expand Up @@ -176,6 +214,7 @@ class CommunityHealthUnitContactListView(generics.ListCreateAPIView):
ordering_fields = ('health_unit', 'contact', )



class CommunityHealthUnitContactDetailView(
AuditableDetailViewMixin,
generics.RetrieveUpdateDestroyAPIView):
Expand Down Expand Up @@ -215,6 +254,20 @@ class CommunityHealthUnitDetailView(
queryset = CommunityHealthUnit.objects.all()
serializer_class = CommunityHealthUnitSerializer

class CommunityHealthUnitSummaryView(generics.ListAPIView):
def get_queryset(self):
with connection.cursor() as cursor:
cursor.execute("SELECT chul_status.name, COUNT(chul_communityhealthunit.status_id) As counts FROM chul_communityhealthunit INNER JOIN chul_status ON chul_communityhealthunit.status_id = chul_status.id GROUP BY chul_status.name")
rows = cursor.fetchall()
return rows

def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
data = []
for row in queryset:
data.append({"name": row[0], "count": row[1]})
return JsonResponse(data, safe=False)


class CommunityHealthWorkerListView(generics.ListCreateAPIView):

Expand Down Expand Up @@ -312,6 +365,7 @@ class ChuUpdateBufferListView(
serializer_class = ChuUpdateBufferSerializer
filter_class = ChuUpdateBufferFilter
ordering_fields = ('health_unit', )
# print(queryset)


class ChuUpdateBufferDetailView(
Expand Down
35 changes: 35 additions & 0 deletions common/migrations/0020_auto_20221205_0904.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.27 on 2022-12-05 09:04
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('common', '0019_auto_20191021_1227'),
]

operations = [
migrations.AlterField(
model_name='apiauthentication',
name='client_secret',
field=models.CharField(default=b'', max_length=255),
),
migrations.AlterField(
model_name='apiauthentication',
name='password',
field=models.CharField(default=b'', max_length=255),
),
migrations.AlterField(
model_name='apiauthentication',
name='server',
field=models.CharField(default=b'http://testhis.uonbi.ac.ke/', max_length=255),
),
migrations.AlterField(
model_name='apiauthentication',
name='username',
field=models.CharField(default=b'kmhfl_integration', max_length=255),
),
]
20 changes: 20 additions & 0 deletions common/migrations/0021_auto_20230302_0642.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.27 on 2023-03-02 06:42
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('common', '0020_auto_20221205_0904'),
]

operations = [
migrations.AlterField(
model_name='apiauthentication',
name='server',
field=models.CharField(default=b'https://test.hiskenya.org/', max_length=255),
),
]
Loading