From f62534221cba85c9b129ff3285cb17b25a1f8a77 Mon Sep 17 00:00:00 2001 From: ertush Date: Fri, 12 Jul 2024 15:20:10 +0300 Subject: [PATCH 01/50] Updated facilities/utils.py --- facilities/utils.py | 30 ++++++++++++++------------ facilities/views/facility_dashboard.py | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/facilities/utils.py b/facilities/utils.py index 785db043..b2a7b118 100755 --- a/facilities/utils.py +++ b/facilities/utils.py @@ -281,20 +281,22 @@ def _create_contacts(self, data): contacts = data.get('contacts', []) created_contacts = [] - for contact in contacts: - contact_type = ContactType.objects.get(id=contact.get('contact_type')) - contact_dict = { - "contact_type": contact_type, - "contact": contact.get('contact') - } - try: - created_contacts.append(Contact.objects.get(**contact_dict)) - except Contact.DoesNotExist: - contact_dict = self._inject_creating_user(contact_dict) - contact_dict = self._inject_creating_user(contact_dict) - created_contacts.append(Contact.objects.create(**contact_dict)) - - return created_contacts + if len(contacts) >= 1: + for contact in contacts: + if 'contact_type' in contact: + contact_type = ContactType.objects.get(id=contact.get('contact_type')) + contact_dict = { + "contact_type": contact_type, + "contact": contact.get('contact') + } + try: + created_contacts.append(Contact.objects.get(**contact_dict)) + except Contact.DoesNotExist: + contact_dict = self._inject_creating_user(contact_dict) + contact_dict = self._inject_creating_user(contact_dict) + created_contacts.append(Contact.objects.create(**contact_dict)) + + return created_contacts def _create_facility_officer(self, data): facility = Facility.objects.get(id=data['facility_id']) diff --git a/facilities/views/facility_dashboard.py b/facilities/views/facility_dashboard.py index 5446c49c..32c604c8 100755 --- a/facilities/views/facility_dashboard.py +++ b/facilities/views/facility_dashboard.py @@ -526,7 +526,7 @@ def get_facilities_kephlevel_count(self, county_name, period_start, period_end): def _get_user_top_level(self): userid = self.request.user.groups.all()[0].id resultobject = {'userlevel': ''} - if userid == 5 or userid == 6 or userid == 7: + if userid == 5 or userid == 6 or userid == 7 or userid == 11: resultobject['userlevel'] = 'national' elif userid == 1 or userid == 12: resultobject['userlevel'] = 'county' From a47f94238375f180524a0b4b891f0845729e6bdb Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 12 Jul 2024 15:32:40 +0300 Subject: [PATCH 02/50] Facility push to KHIS Fix --- facilities/models/facility_models.py | 80 +++++++++++++++++++++------- 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index e856cd3d..5057bd2e 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -136,7 +136,7 @@ def get_org_unit_id(self, code): } ) print("Get Org Unit ID Response", r.text, str(code)) - if len(r.json()["organisationUnits"]) is 1: + if len(r.json()["organisationUnits"]) is 1 and "id" in r.json()["organisationUnits"][0]: # raise ValidationError( # { # "Error!": ["This facility is already available in DHIS2. Please ensure details are correct"] @@ -161,7 +161,9 @@ def get_org_unit_id(self, code): # ) def get_parent_id(self, ward_id): + # print self.session_store[self.oauth2_token_variable_name] + r = requests.get( settings.DHIS_ENDPOINT+"api/organisationUnits.json", auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), @@ -182,7 +184,7 @@ def get_parent_id(self, ward_id): if dhis2_facility[0]["id"] is None: raise ValidationError( { - "Error!": ["Unable to resolve exact parent of the new facility in DHIS2"] + "Error!": ["Unable to resolve exact parent of the facility in DHIS2"] } ) else: @@ -200,7 +202,17 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility=True): }, json=new_facility_payload ) - LOGGER.info("Create Facility Response: %s" % r.text) + + if r.json()["status"] != "OK": + + raise ValidationError( + { + "Error!": [ + "An error occured while creating the facility in KHIS Aggregate. This is may be caused by the " + "existance of an organisation unit with as similar name as to the one you are creating. KHIS Error: {}".format(r.text) + ] + } + ) else: facility = requests.get( settings.DHIS_ENDPOINT + "api/organisationUnits/" + new_facility_payload.pop('id'), @@ -221,16 +233,16 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility=True): }, json=new_facility_payload ) - LOGGER.info("Update Facility Response: %s" % r.text) - if r.json()["status"] != "OK": - LOGGER.error('Facility feedback: %s' % r.text) - raise ValidationError( - { - "Error!": ["An error occured while pushing facility to DHIS2. This is may be caused by the " - "existance of an organisation unit with as similar name as to the one you are creating. " - "Or some specific information like codes are not unique"] - } - ) + + + if r.json()["status"] != "OK": + + raise ValidationError( + { + "Error!": ["An error occured while updating this facility in KHIS Aggregate. KHIS Error {}".format(r.text)] + } + ) + def push_facility_metadata(self, metadata_payload, facility_uid): # Keph Level @@ -278,7 +290,9 @@ def push_facility_metadata(self, metadata_payload, facility_uid): def push_facility_updates_to_dhis2(self, org_unit_id, facility_updates_payload): r = requests.put( + settings.DHIS_ENDPOINT + "api/organisationUnits/"+org_unit_id[0], + auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), headers={ "Accept": "application/json" @@ -286,6 +300,7 @@ def push_facility_updates_to_dhis2(self, org_unit_id, facility_updates_payload): json=facility_updates_payload ) + print("Update Facility Response", r.url, r.status_code, r.json()) LOGGER.info('[>>>>>>>>>>>>>] Org_unit_id: {} \n payload: {} \n response: {}'.format(org_unit_id, facility_updates_payload, r.json())) @@ -299,12 +314,14 @@ def push_facility_updates_to_dhis2(self, org_unit_id, facility_updates_payload): }, json=facility_updates_payload ) + # raise ValidationError( # { # "Error!": ["Unable to push facility updates to DHIS2"] # } # ) + def format_coordinates(self, str_coordinates): coordinates_str_list = str_coordinates.split(" ") return str([float(coordinates_str_list[0]), float(coordinates_str_list[1])]) @@ -1029,7 +1046,12 @@ class FacilityExportExcelMaterialView(models.Model): long = models.CharField(max_length=30, null=True, blank=True) lat = models.CharField(max_length=30, null=True, blank=True) approved_national_level = models.BooleanField(default=False) - + # number_of_minor_theatres = models.PositiveIntegerField( + # default=0) + # number_of_eye_theatres = models.PositiveIntegerField( + # default=0) + # new_born_unit = models.BooleanField(default=False) + # out_reach_services = models.BooleanField(default=False) class Meta(object): managed = False ordering = ('-created', ) @@ -1109,6 +1131,7 @@ class Facility(SequenceMixin, AbstractBase): default=0, help_text="The number of maternity theatres " " that a facility has e.g 0") + number_of_minor_theatres = models.PositiveIntegerField( default=0, help_text="The number of minor theatres " @@ -1118,7 +1141,9 @@ class Facility(SequenceMixin, AbstractBase): help_text="The number of eye theatres " " that a facility has e.g 0") new_born_unit = models.BooleanField(default=False) + out_reach_services = models.BooleanField(default=False) + open_whole_day = models.BooleanField( default=False, help_text="Does the facility operate 24 hours a day") @@ -1270,6 +1295,7 @@ class Facility(SequenceMixin, AbstractBase): dhis2_api_auth = DhisAuth() def push_new_facility(self, code=None): + # If is approved national level and operational status is opertaional and is reporting to dhis and SETTINGS.PUSH_TO_DHIS is True; then push faciliti DHIS if self.approved_national_level and str(self.operation_status.id) == 'ae75777e-5ce3-4ac9-a17e-63823c34b55e' \ and self.reporting_in_dhis is True and settings.PUSH_TO_DHIS: from mfl_gis.models import FacilityCoordinates @@ -1282,7 +1308,9 @@ def push_new_facility(self, code=None): "20b86171-0c16-47e1-9277-5e773d485c33": "YQK9pleIoeB", "5eb392ac-d10a-40c9-b525-53dac866ef6c": "lTrpyOiOcM6", "8949eeb0-40b1-43d4-a38d-5d4933dc209f": "lTrpyOiOcM6", + "0b7f9699-6024-4813-8801-38f188c834f5": "lTrpyOiOcM6", + "ccc1600e-9a24-499f-889f-bd9f0bdc4b95": "YQK9pleIoeB", "d8d741b1-21c5-45c8-86d0-a2094bf9bda6": "YQK9pleIoeB", "85f2099b-a2f8-49f4-9798-0cb48c0875ff": "YQK9pleIoeB", @@ -1308,8 +1336,10 @@ def push_new_facility(self, code=None): "87626d3d-fd19-49d9-98da-daca4afe85bf": "mVrepdLAqSD", "79158397-0d87-4d0e-8694-ad680a907a79": "YQK9pleIoeB", "031293d9-fd8a-4682-a91e-a4390d57b0cf": "YQK9pleIoeB", + "4369eec8-0416-4e16-b013-e635ce46a02f": "YQK9pleIoeB", "9ad22615-48f2-47b3-8241-4355bb7db835" : "rhKJPLo27x7", + } kmhfl_dhis2_ownership_mapping = { "d45541f8-3b3d-475b-94f4-17741d468135": "aRxa6o8GqZN", @@ -1335,6 +1365,7 @@ def push_new_facility(self, code=None): "2e651780-2ed4-4f8c-9061-6e5acf95d581": "AaAF5EmS1fk", "30af7e3f-cd52-4ca0-b5dc-d8b1040a9808": "AaAF5EmS1fk", "d64bbd8a-4013-463b-a238-c346cee66a92": "AaAF5EmS1fk", + } kmhfl_dhis2_keph_mapping = { "ed23da85-4c92-45af-80fa-9b2123769f49": "FpY8vg4gh46", @@ -1376,7 +1407,6 @@ def push_new_facility(self, code=None): else: pass - def validate_facility_name(self): if self.pk: @@ -1577,6 +1607,7 @@ def latest_approval_or_rejection(self): def get_facility_services(self): """Digests the facility_services for the sake of frontend.""" services = self.facility_services.all() + return [ { "id": service.id, @@ -1599,7 +1630,9 @@ def get_facility_services(self): @property def get_facility_contacts(self): """For the same purpose as the get_facility_services above""" + contacts = self.facility_contacts.all() + return [ { "id": contact.id, @@ -1658,6 +1691,7 @@ def get_facility_specialities(self): # for h_r in hr # ] + @property def average_rating(self): avg_service_rating = [ @@ -1855,9 +1889,9 @@ def save(self, *args, **kwargs): # NOQA approved. """ from facilities.serializers import FacilityDetailSerializer - if not self.code and self.is_complete and self.approved_national_level: - self.code = self.generate_next_code_sequence() - self.push_new_facility() + # if not self.code and self.is_complete and self.approved_national_level is None: + self.code = self.generate_next_code_sequence() + self.push_new_facility() if not self.official_name: self.official_name = self.name @@ -2101,15 +2135,19 @@ def update_facility(self): new_date = datetime.date(year=value.year, month=value.month, day=value.day) value = new_date elif field_name == 'sub_county_id': + print('field_name error', field_changed.get('display_value')) + value = SubCounty.objects.get(id=field_changed.get('actual_value')).id else: value = field_changed.get("actual_value") setattr(self.facility, field_name, value) self.facility.save(allow_save=True) + #if self.facility.code and self.facility.is_complete and self.facility.approved_national_level: # self.facility.push_new_facility(self.facility.code) + self.push_facility_updates() @@ -2237,6 +2275,7 @@ def validate_only_one_update_at_a_time(self): raise ValidationError(error) def push_facility_updates(self): + # Don't push facility updates to KHIS if facility not validated , approved nationally and reporting to KHIS if self.facility.is_approved and self.facility.approved_national_level and self.facility.reporting_in_dhis: from mfl_gis.models import FacilityCoordinates @@ -2267,6 +2306,7 @@ def push_facility_updates(self): # print("Names;", "Official Name:", self.facility.official_name, "Name:", self.facility.name) # print("New Facility Push Payload => ", new_facility_updates_payload) + self.dhis2_api_auth.push_facility_updates_to_dhis2(dhis2_org_unit_id, new_facility_updates_payload) def clean(self, *args, **kwargs): @@ -2940,8 +2980,10 @@ class FacilitySpecialist(AbstractBase): Facility, related_name='facility_specialists', on_delete=models.PROTECT) + speciality = models.ForeignKey(Speciality, related_name='speciality', on_delete=models.PROTECT) + count = models.IntegerField( default=0, blank=True, @@ -3060,9 +3102,11 @@ class FacilityInfrastructure(AbstractBase): infrastructure = models.ForeignKey( Infrastructure, + related_name='infrastructure', on_delete=models.PROTECT) + count = models.IntegerField( default=0, blank=True, From 26dd827a7ef3b3fbf7f8cad7d105b4c07a939574 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 12 Jul 2024 15:37:38 +0300 Subject: [PATCH 03/50] Added github action to deploy to production --- .github/workflows/ci-prod.yml | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/ci-prod.yml diff --git a/.github/workflows/ci-prod.yml b/.github/workflows/ci-prod.yml new file mode 100644 index 00000000..ddc907e5 --- /dev/null +++ b/.github/workflows/ci-prod.yml @@ -0,0 +1,36 @@ +name: CI + +on: + push: + branches: [ mfr-api-prod ] + + +jobs: + + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Deploy to VPS + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + port: ${{ secrets.SERVER_PORT }} + username: ${{ secrets.SERVER_USER }} + password: ${{ secrets.SERVER_KEY }} + script: | + set -e + cd /opt/mfl_api + if ! [[ -d './.git' ]]; then git init; fi + if ! [[ `git remote -v | awk '{print $1}' | head -n 1` =~ 'origin' ]]; then git remote add origin ${{ github.server_url }}${{ github.username }}/${{ github.repository }}.git; fi + git stash + git pull origin mfr-api-prod + echo ${{ secrets.SERVER_KEY }} | sudo -S service supervisor restart + + + + + + + \ No newline at end of file From 61f8e48b9c2a069dffa26a424ab5db29e81d756b Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 12 Jul 2024 15:50:21 +0300 Subject: [PATCH 04/50] Renamed the github workflow for deploying to production --- .github/workflows/ci-prod.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-prod.yml b/.github/workflows/ci-prod.yml index ddc907e5..9db3fc10 100644 --- a/.github/workflows/ci-prod.yml +++ b/.github/workflows/ci-prod.yml @@ -1,4 +1,4 @@ -name: CI +name: CI-Prod on: push: From a4c99fd922b3f32c78e695d4c709d76a0f1633e9 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 12 Jul 2024 18:26:52 +0300 Subject: [PATCH 05/50] Fixed Issue of Facility Update in facility_models.py --- facilities/models/facility_models.py | 29 +++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 5057bd2e..f934e36b 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -306,20 +306,22 @@ def push_facility_updates_to_dhis2(self, org_unit_id, facility_updates_payload): if r.json()["status"] != "OK": - r = requests.post( - settings.DHIS_ENDPOINT + "api/organisationUnits/", - auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), - headers={ - "Accept": "application/json" - }, - json=facility_updates_payload - ) + # r = requests.post( + # settings.DHIS_ENDPOINT + "api/organisationUnits/", + # auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), + # headers={ + # "Accept": "application/json" + # }, + # json=facility_updates_payload + # ) - # raise ValidationError( - # { - # "Error!": ["Unable to push facility updates to DHIS2"] - # } - # ) + raise ValidationError( + { + "Error!": ["Unable to push facility updates to KHIS. Created a new facility {}".format(r.text())] + } + ) + else: + return r.json() def format_coordinates(self, str_coordinates): @@ -2291,6 +2293,7 @@ def push_facility_updates(self): LOGGER.error('[>>>>>Info] coordinates: {}, FacilityCoordinatesObj: {}'.format(coordinates, FacilityCoordinates.objects.values('coordinates') .get(facility_id=self.facility.id)['coordinates'])) + new_facility_updates_payload = { "code": str(self.facility.code), "name": str(self.facility.name), From 2b2899cd8894c2179dddf377328ba63d4b23d7a3 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 15 Jul 2024 16:52:42 +0300 Subject: [PATCH 06/50] Hotfix update for approve national level update --- facilities/models/facility_models.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index f934e36b..99e64d8f 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -1891,9 +1891,9 @@ def save(self, *args, **kwargs): # NOQA approved. """ from facilities.serializers import FacilityDetailSerializer - # if not self.code and self.is_complete and self.approved_national_level is None: - self.code = self.generate_next_code_sequence() - self.push_new_facility() + if not self.code and self.is_complete and self.approved_national_level: + self.code = self.generate_next_code_sequence() + self.push_new_facility() if not self.official_name: self.official_name = self.name @@ -2147,10 +2147,9 @@ def update_facility(self): setattr(self.facility, field_name, value) self.facility.save(allow_save=True) - #if self.facility.code and self.facility.is_complete and self.facility.approved_national_level: - # self.facility.push_new_facility(self.facility.code) - - self.push_facility_updates() + if self.facility.code and self.facility.is_complete and self.facility.approved_national_level: + #self.facility.push_new_facility(self.facility.code) + self.push_facility_updates() def update_facility_services(self): From 6ac30031f5b856905f866fda4b3714436011c99c Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 17 Jul 2024 17:24:33 +0300 Subject: [PATCH 07/50] Updated line 238 of mfr-api-prod: chul/models.py --- chul/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chul/models.py b/chul/models.py index 85cd843e..db292e3e 100755 --- a/chul/models.py +++ b/chul/models.py @@ -235,7 +235,7 @@ def pending_updates(self): health_unit=self ) - chu = chu_update_buffer[0] if len(chu_update_buffer) > 0 else ChuUpdateBuffer.objects.get( + chu = chu_update_buffer[-1] if len(chu_update_buffer) > 0 else ChuUpdateBuffer.objects.get( is_approved=False, is_rejected=False, health_unit=self From fc827aa3cdbb2d95d541cc7096aa9af3c3c6642a Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 17 Jul 2024 17:29:54 +0300 Subject: [PATCH 08/50] Reversed: Updated line 238 of mfr-api-prod: chul/models.py --- chul/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chul/models.py b/chul/models.py index db292e3e..85cd843e 100755 --- a/chul/models.py +++ b/chul/models.py @@ -235,7 +235,7 @@ def pending_updates(self): health_unit=self ) - chu = chu_update_buffer[-1] if len(chu_update_buffer) > 0 else ChuUpdateBuffer.objects.get( + chu = chu_update_buffer[0] if len(chu_update_buffer) > 0 else ChuUpdateBuffer.objects.get( is_approved=False, is_rejected=False, health_unit=self From c4ab289c43e26b79ffd52cddaf879f25ec5d12fd Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 24 Jul 2024 12:36:12 +0300 Subject: [PATCH 09/50] Changed the first argument of push_facility_updates_to_dhis2 method to parent_id and modified the log messages --- facilities/models/facility_models.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 99e64d8f..6f91e594 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -288,10 +288,10 @@ def push_facility_metadata(self, metadata_payload, facility_uid): # } # ) - def push_facility_updates_to_dhis2(self, org_unit_id, facility_updates_payload): + def push_facility_updates_to_dhis2(self, parent_id, facility_updates_payload): r = requests.put( - settings.DHIS_ENDPOINT + "api/organisationUnits/"+org_unit_id[0], + settings.DHIS_ENDPOINT + "api/organisationUnits/" + parent_id, auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), headers={ @@ -302,7 +302,7 @@ def push_facility_updates_to_dhis2(self, org_unit_id, facility_updates_payload): print("Update Facility Response", r.url, r.status_code, r.json()) - LOGGER.info('[>>>>>>>>>>>>>] Org_unit_id: {} \n payload: {} \n response: {}'.format(org_unit_id, facility_updates_payload, r.json())) + LOGGER.info('[DEBUG]: parent_id: {} \n [DEBUG]: payload: {} \n [DEBUG]: response: {}'.format(parent_id, facility_updates_payload, r.json())) if r.json()["status"] != "OK": @@ -317,7 +317,7 @@ def push_facility_updates_to_dhis2(self, org_unit_id, facility_updates_payload): raise ValidationError( { - "Error!": ["Unable to push facility updates to KHIS. Created a new facility {}".format(r.text())] + "Error!": ["Unable to push facility updates to KHIS. Created a new facility {}".format(r)] } ) else: @@ -719,7 +719,7 @@ def _ensure_a_user_is_linked_to_just_one_regulator(self): else: msg = "The user {0} was successfully linked to the regulator {1}"\ "".format(self.user.id, self.regulatory_body.id) - LOGGER.info(msg) + LOGGER.info("[DEBUG]: {}".format(msg)) def make_user_national_user(self): self.user.is_national = True @@ -1861,7 +1861,7 @@ def _dump_updates(self, origi_model): return json.dumps(data) else: message = "The facility was not scheduled for update" - LOGGER.info(message) + LOGGER.info("[DEBUG]: {}".format(message)) def index_facility_material_view(self): """ @@ -2284,7 +2284,7 @@ def push_facility_updates(self): self.dhis2_api_auth.get_oauth2_token() dhis2_parent_id = self.dhis2_api_auth.get_parent_id(self.facility.ward.code) - dhis2_org_unit_id = self.dhis2_api_auth.get_org_unit_id(self.facility.code) + # dhis2_org_unit_id = self.dhis2_api_auth.get_org_unit_id(self.facility.code) coordinates = self.dhis2_api_auth.format_coordinates( re.search(r'\((.*?)\)', str(FacilityCoordinates.objects.values('coordinates') @@ -2309,7 +2309,7 @@ def push_facility_updates(self): # print("New Facility Push Payload => ", new_facility_updates_payload) - self.dhis2_api_auth.push_facility_updates_to_dhis2(dhis2_org_unit_id, new_facility_updates_payload) + self.dhis2_api_auth.push_facility_updates_to_dhis2(dhis2_parent_id, new_facility_updates_payload) def clean(self, *args, **kwargs): self.validate_only_one_update_at_a_time() From 485068f4ae4ca1801f9db0aec2a79da0e95530e5 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 24 Jul 2024 13:33:28 +0300 Subject: [PATCH 10/50] Attempt #2 to fix the issue of pushing new facility to KHIS on facility update approval --- facilities/models/facility_models.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 6f91e594..d4908d50 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -288,10 +288,10 @@ def push_facility_metadata(self, metadata_payload, facility_uid): # } # ) - def push_facility_updates_to_dhis2(self, parent_id, facility_updates_payload): + def push_facility_updates_to_dhis2(self, org_unit_id, facility_updates_payload): r = requests.put( - settings.DHIS_ENDPOINT + "api/organisationUnits/" + parent_id, + settings.DHIS_ENDPOINT + "api/organisationUnits/" + org_unit_id, auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), headers={ @@ -302,7 +302,7 @@ def push_facility_updates_to_dhis2(self, parent_id, facility_updates_payload): print("Update Facility Response", r.url, r.status_code, r.json()) - LOGGER.info('[DEBUG]: parent_id: {} \n [DEBUG]: payload: {} \n [DEBUG]: response: {}'.format(parent_id, facility_updates_payload, r.json())) + LOGGER.info('[DEBUG]: parent_id: {} \n [DEBUG]: payload: {} \n [DEBUG]: response: {}'.format(org_unit_id, facility_updates_payload, r.json())) if r.json()["status"] != "OK": @@ -2284,7 +2284,7 @@ def push_facility_updates(self): self.dhis2_api_auth.get_oauth2_token() dhis2_parent_id = self.dhis2_api_auth.get_parent_id(self.facility.ward.code) - # dhis2_org_unit_id = self.dhis2_api_auth.get_org_unit_id(self.facility.code) + dhis2_org_unit_id = self.dhis2_api_auth.get_org_unit_id(self.facility.code) coordinates = self.dhis2_api_auth.format_coordinates( re.search(r'\((.*?)\)', str(FacilityCoordinates.objects.values('coordinates') @@ -2308,8 +2308,9 @@ def push_facility_updates(self): # print("Names;", "Official Name:", self.facility.official_name, "Name:", self.facility.name) # print("New Facility Push Payload => ", new_facility_updates_payload) + new_facility = False if dhis2_org_unit_id[1] == 'retrived' else True - self.dhis2_api_auth.push_facility_updates_to_dhis2(dhis2_parent_id, new_facility_updates_payload) + self.dhis2_api_auth.push_facility_to_dhis2(new_facility_updates_payload, new_facility) def clean(self, *args, **kwargs): self.validate_only_one_update_at_a_time() From 102faea3da9951ab3fa34bdad49b1ad6bba01b92 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 30 Jul 2024 17:45:16 +0300 Subject: [PATCH 11/50] Updated line 122 of chul/models.py --- chul/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chul/serializers.py b/chul/serializers.py index 485b5a32..828b5d47 100755 --- a/chul/serializers.py +++ b/chul/serializers.py @@ -119,7 +119,7 @@ def buffer_updates( services=None): try: - update = ChuUpdateBuffer.objects.get( + update = ChuUpdateBuffer.objects.latest( health_unit=chu_instance, is_approved=False, is_rejected=False) except ChuUpdateBuffer.DoesNotExist: From 179876a04fe2d838b49899db34a7ddd5a4561e86 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 30 Jul 2024 18:04:17 +0300 Subject: [PATCH 12/50] Updated lines 124-126 of chul/models.py --- chul/serializers.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/chul/serializers.py b/chul/serializers.py index 828b5d47..5295101c 100755 --- a/chul/serializers.py +++ b/chul/serializers.py @@ -119,9 +119,15 @@ def buffer_updates( services=None): try: - update = ChuUpdateBuffer.objects.latest( + chu_updates = ChuUpdateBuffer.objects.filter( health_unit=chu_instance, is_approved=False, is_rejected=False) + + update = chu_updates[-1] if chu_updates._len__() > 0 else None + + if update is None: + raise ChuUpdateBuffer.DoesNotExist + except ChuUpdateBuffer.DoesNotExist: update = ChuUpdateBuffer.objects.create( health_unit=chu_instance, From 8ede191605ee26167e99cb62452b64fa0512f5e0 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 30 Jul 2024 18:19:54 +0300 Subject: [PATCH 13/50] Updated lines 124-126 of chul/models.py --- chul/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chul/serializers.py b/chul/serializers.py index 5295101c..c8b5db02 100755 --- a/chul/serializers.py +++ b/chul/serializers.py @@ -123,7 +123,7 @@ def buffer_updates( health_unit=chu_instance, is_approved=False, is_rejected=False) - update = chu_updates[-1] if chu_updates._len__() > 0 else None + update = chu_updates[-1] if chu_updates.__len__() > 0 else None if update is None: raise ChuUpdateBuffer.DoesNotExist From 77339ccc3dd5947765bce6873e60e94fb9299d83 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 30 Jul 2024 18:24:49 +0300 Subject: [PATCH 14/50] Updated lines 124-126 of chul/models.py --- chul/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chul/serializers.py b/chul/serializers.py index c8b5db02..e347d6fc 100755 --- a/chul/serializers.py +++ b/chul/serializers.py @@ -123,7 +123,7 @@ def buffer_updates( health_unit=chu_instance, is_approved=False, is_rejected=False) - update = chu_updates[-1] if chu_updates.__len__() > 0 else None + update = chu_updates[chu_updates.__len__() - 1] if chu_updates.__len__() > 0 else None if update is None: raise ChuUpdateBuffer.DoesNotExist From 07b3ec49c302b10f5084a6688e29df6a47bff94f Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 30 Jul 2024 18:29:45 +0300 Subject: [PATCH 15/50] Updated lines 124-126 of chul/models.py --- chul/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chul/serializers.py b/chul/serializers.py index e347d6fc..5e59b0ef 100755 --- a/chul/serializers.py +++ b/chul/serializers.py @@ -123,7 +123,7 @@ def buffer_updates( health_unit=chu_instance, is_approved=False, is_rejected=False) - update = chu_updates[chu_updates.__len__() - 1] if chu_updates.__len__() > 0 else None + update = chu_updates[0] if chu_updates.__len__() > 0 else None if update is None: raise ChuUpdateBuffer.DoesNotExist From cc87e4ee9cdb93584e4c8207bf4258110701c8a9 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 14:09:20 +0300 Subject: [PATCH 16/50] Updated lines 1404-1405 --- facilities/models/facility_models.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index d4908d50..3905d765 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -1400,6 +1400,10 @@ def push_new_facility(self, code=None): "ownership": kmhfl_dhis2_ownership_mapping[str(self.owner_id)] } new_facility = True + + print("[DEBUG] new_facility: {}".format(new_facility)) + LOGGER.info("[DEBUG] new_facility: {}".format(new_facility)) + if dhis2_org_unit_id[1] == 'retrieved': new_facility = False self.dhis2_api_auth.push_facility_to_dhis2(new_facility_payload, new_facility) From a83eaccc6cd9f70686a7789c9a348367eb513c4e Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 14:23:11 +0300 Subject: [PATCH 17/50] Updated lines 1404-1405 --- facilities/models/facility_models.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 3905d765..86f454d4 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -190,7 +190,7 @@ def get_parent_id(self, ward_id): else: return dhis2_facility[0]["id"] - def push_facility_to_dhis2(self, new_facility_payload, new_facility=True): + def push_facility_to_dhis2(self, new_facility_payload, new_facility): if new_facility: r = requests.post( settings.DHIS_ENDPOINT+"api/organisationUnits", @@ -208,8 +208,9 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility=True): raise ValidationError( { "Error!": [ + "[DEBUG] new_facility: {}\n [DEBUG] new_facility_payload: {}".format(new_facility, new_facility_payload), "An error occured while creating the facility in KHIS Aggregate. This is may be caused by the " - "existance of an organisation unit with as similar name as to the one you are creating. KHIS Error: {}".format(r.text) + "existance of an organisation unit with as similar name as to the one you are creating. \n KHIS Error: {}".format(r.text) ] } ) @@ -1400,9 +1401,9 @@ def push_new_facility(self, code=None): "ownership": kmhfl_dhis2_ownership_mapping[str(self.owner_id)] } new_facility = True + - print("[DEBUG] new_facility: {}".format(new_facility)) - LOGGER.info("[DEBUG] new_facility: {}".format(new_facility)) + # LOGGER.info("[DEBUG] new_facility: {}".format(new_facility)) if dhis2_org_unit_id[1] == 'retrieved': new_facility = False From 02577f190a9a57d59ae40996e9514aa402eabea7 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 14:36:41 +0300 Subject: [PATCH 18/50] Updated lines 1404-1405 --- facilities/models/facility_models.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 86f454d4..a6e5546c 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -190,7 +190,7 @@ def get_parent_id(self, ward_id): else: return dhis2_facility[0]["id"] - def push_facility_to_dhis2(self, new_facility_payload, new_facility): + def push_facility_to_dhis2(self, new_facility_payload, new_facility, isRetrived): if new_facility: r = requests.post( settings.DHIS_ENDPOINT+"api/organisationUnits", @@ -208,9 +208,9 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility): raise ValidationError( { "Error!": [ - "[DEBUG] new_facility: {}\n [DEBUG] new_facility_payload: {}".format(new_facility, new_facility_payload), + "[DEBUG] new_facility: {}; [DEBUG] new_facility_payload: {}; [DEBUG] isRetrived: {}".format(new_facility, new_facility_payload, isRetrived), "An error occured while creating the facility in KHIS Aggregate. This is may be caused by the " - "existance of an organisation unit with as similar name as to the one you are creating. \n KHIS Error: {}".format(r.text) + "existance of an organisation unit with as similar name as to the one you are creating. KHIS Error: {}".format(r.text) ] } ) @@ -1407,7 +1407,7 @@ def push_new_facility(self, code=None): if dhis2_org_unit_id[1] == 'retrieved': new_facility = False - self.dhis2_api_auth.push_facility_to_dhis2(new_facility_payload, new_facility) + self.dhis2_api_auth.push_facility_to_dhis2(new_facility_payload, new_facility, dhis2_org_unit_id) # facility_uid = self.dhis2_api_auth.get_org_unit_id(self.code) facility_uid = dhis2_org_unit_id[0] self.dhis2_api_auth.push_facility_metadata(metadata_payload, facility_uid) From 4b9c50d6fcb3aca8aefbf79257f177d347b016c6 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 14:54:20 +0300 Subject: [PATCH 19/50] Added debug statement --- facilities/models/facility_models.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index a6e5546c..cfef7ff8 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -136,12 +136,9 @@ def get_org_unit_id(self, code): } ) print("Get Org Unit ID Response", r.text, str(code)) + raise ValidationError("[DEBUG] Repsonse {}".format(r.text)) + if len(r.json()["organisationUnits"]) is 1 and "id" in r.json()["organisationUnits"][0]: - # raise ValidationError( - # { - # "Error!": ["This facility is already available in DHIS2. Please ensure details are correct"] - # } - # ) return [r.json()["organisationUnits"][0]["id"], 'retrieved'] else: r_generate_orgunit_uid = requests.get( @@ -190,7 +187,7 @@ def get_parent_id(self, ward_id): else: return dhis2_facility[0]["id"] - def push_facility_to_dhis2(self, new_facility_payload, new_facility, isRetrived): + def push_facility_to_dhis2(self, new_facility_payload, new_facility): if new_facility: r = requests.post( settings.DHIS_ENDPOINT+"api/organisationUnits", @@ -1383,6 +1380,7 @@ def push_new_facility(self, code=None): facility_code = str(self.code) new_facility_payload = { "id": dhis2_org_unit_id[0], + "access": dhis2_org_unit_id[1], "code": facility_code, "name": str(self.name), "shortName": str(self.name[:49]), @@ -1407,7 +1405,7 @@ def push_new_facility(self, code=None): if dhis2_org_unit_id[1] == 'retrieved': new_facility = False - self.dhis2_api_auth.push_facility_to_dhis2(new_facility_payload, new_facility, dhis2_org_unit_id) + self.dhis2_api_auth.push_facility_to_dhis2(new_facility_payload, new_facility) # facility_uid = self.dhis2_api_auth.get_org_unit_id(self.code) facility_uid = dhis2_org_unit_id[0] self.dhis2_api_auth.push_facility_metadata(metadata_payload, facility_uid) From 2473d66dacecbee7071f94a0c502e4c18b0aa1a9 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 15:05:04 +0300 Subject: [PATCH 20/50] Updated lines 1404-1405 --- facilities/models/facility_models.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index cfef7ff8..66e1e131 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -135,10 +135,9 @@ def get_org_unit_id(self, code): "paging": "false" } ) - print("Get Org Unit ID Response", r.text, str(code)) - raise ValidationError("[DEBUG] Repsonse {}".format(r.text)) if len(r.json()["organisationUnits"]) is 1 and "id" in r.json()["organisationUnits"][0]: + raise ValidationError("[DEBUG] Repsonse {}".format(r.text)) return [r.json()["organisationUnits"][0]["id"], 'retrieved'] else: r_generate_orgunit_uid = requests.get( @@ -205,7 +204,7 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility): raise ValidationError( { "Error!": [ - "[DEBUG] new_facility: {}; [DEBUG] new_facility_payload: {}; [DEBUG] isRetrived: {}".format(new_facility, new_facility_payload, isRetrived), + "[DEBUG] new_facility: {}; [DEBUG] new_facility_payload: {}; [DEBUG] isRetrived: {}".format(new_facility, new_facility_payload), "An error occured while creating the facility in KHIS Aggregate. This is may be caused by the " "existance of an organisation unit with as similar name as to the one you are creating. KHIS Error: {}".format(r.text) ] @@ -1380,7 +1379,6 @@ def push_new_facility(self, code=None): facility_code = str(self.code) new_facility_payload = { "id": dhis2_org_unit_id[0], - "access": dhis2_org_unit_id[1], "code": facility_code, "name": str(self.name), "shortName": str(self.name[:49]), From 11a915d39fcf4d328139889ab271f4d10297af1f Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 15:11:27 +0300 Subject: [PATCH 21/50] added a debug line in facility_models.py: 140 --- facilities/models/facility_models.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 66e1e131..79f18d4d 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -147,6 +147,8 @@ def get_org_unit_id(self, code): "Accept": "application/json" }, ) + raise ValidationError("[DEBUG] Repsonse_Generated {}".format(r_generate_orgunit_uid.json()['codes'][0])) + # print("New OrgUnit UID Generated-", r_generate_orgunit_uid.json()['codes'][0]) return [r_generate_orgunit_uid.json()['codes'][0], 'generated'] # raise ValidationError( From 1b249602189529bfbd494b6f86e270ffcd8f34f5 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 15:18:04 +0300 Subject: [PATCH 22/50] added a debug line in facility_models.py: 140 --- facilities/models/facility_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 79f18d4d..65a2d0c1 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -137,7 +137,7 @@ def get_org_unit_id(self, code): ) if len(r.json()["organisationUnits"]) is 1 and "id" in r.json()["organisationUnits"][0]: - raise ValidationError("[DEBUG] Repsonse {}".format(r.text)) + raise ValidationError("[DEBUG] Repsonse {}; Return {}".format(r.text, r.json()["organisationUnits"][0]["id"])) return [r.json()["organisationUnits"][0]["id"], 'retrieved'] else: r_generate_orgunit_uid = requests.get( From 6fa5d01f38977045e2484bb469056053ee519e08 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 15:25:53 +0300 Subject: [PATCH 23/50] added a debug line in facility_models.py: 144 --- facilities/models/facility_models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 65a2d0c1..755afbe3 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -137,6 +137,7 @@ def get_org_unit_id(self, code): ) if len(r.json()["organisationUnits"]) is 1 and "id" in r.json()["organisationUnits"][0]: + raise ValidationError("[DEBUG] Repsonse {}; Return {}".format(r.text, r.json()["organisationUnits"][0]["id"])) return [r.json()["organisationUnits"][0]["id"], 'retrieved'] else: From 9bd2985353015de02c3f6342ab7ce4341a5e0ab4 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 16:51:20 +0300 Subject: [PATCH 24/50] added a debug line in facility_models.py: 146 --- facilities/models/facility_models.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 755afbe3..8806b3e1 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -137,8 +137,6 @@ def get_org_unit_id(self, code): ) if len(r.json()["organisationUnits"]) is 1 and "id" in r.json()["organisationUnits"][0]: - - raise ValidationError("[DEBUG] Repsonse {}; Return {}".format(r.text, r.json()["organisationUnits"][0]["id"])) return [r.json()["organisationUnits"][0]["id"], 'retrieved'] else: r_generate_orgunit_uid = requests.get( @@ -148,7 +146,6 @@ def get_org_unit_id(self, code): "Accept": "application/json" }, ) - raise ValidationError("[DEBUG] Repsonse_Generated {}".format(r_generate_orgunit_uid.json()['codes'][0])) # print("New OrgUnit UID Generated-", r_generate_orgunit_uid.json()['codes'][0]) return [r_generate_orgunit_uid.json()['codes'][0], 'generated'] @@ -2289,7 +2286,9 @@ def push_facility_updates(self): dhis2_parent_id = self.dhis2_api_auth.get_parent_id(self.facility.ward.code) dhis2_org_unit_id = self.dhis2_api_auth.get_org_unit_id(self.facility.code) - + + raise ValueError("[DEBUG] dhis2_org_unit_id: {}".format(dhis2_org_unit_id)) + coordinates = self.dhis2_api_auth.format_coordinates( re.search(r'\((.*?)\)', str(FacilityCoordinates.objects.values('coordinates') .get(facility_id=self.facility.id)['coordinates'])).group(1)) From d81c4972ad64d47bf067590746efe1affe0ab922 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 17:08:31 +0300 Subject: [PATCH 25/50] added a debug line in facility_models.py: 146 --- facilities/models/facility_models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 8806b3e1..b5fb3e38 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -1396,11 +1396,14 @@ def push_new_facility(self, code=None): "keph": kmhfl_dhis2_keph_mapping[str(self.keph_level_id)], "ownership": kmhfl_dhis2_ownership_mapping[str(self.owner_id)] } + new_facility = True # LOGGER.info("[DEBUG] new_facility: {}".format(new_facility)) + raise ValueError("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) + if dhis2_org_unit_id[1] == 'retrieved': new_facility = False self.dhis2_api_auth.push_facility_to_dhis2(new_facility_payload, new_facility) @@ -2287,7 +2290,7 @@ def push_facility_updates(self): dhis2_parent_id = self.dhis2_api_auth.get_parent_id(self.facility.ward.code) dhis2_org_unit_id = self.dhis2_api_auth.get_org_unit_id(self.facility.code) - raise ValueError("[DEBUG] dhis2_org_unit_id: {}".format(dhis2_org_unit_id)) + coordinates = self.dhis2_api_auth.format_coordinates( re.search(r'\((.*?)\)', str(FacilityCoordinates.objects.values('coordinates') From 45984c3faa64031084bbc091b776e617b3af3a77 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 17:41:34 +0300 Subject: [PATCH 26/50] added a debug line in facility_models.py: 147 --- facilities/models/facility_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index b5fb3e38..e9443660 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -204,7 +204,7 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility): raise ValidationError( { "Error!": [ - "[DEBUG] new_facility: {}; [DEBUG] new_facility_payload: {}; [DEBUG] isRetrived: {}".format(new_facility, new_facility_payload), + "[DEBUG] new_facility: {}; [DEBUG] new_facility_payload: {}".format(new_facility, new_facility_payload), "An error occured while creating the facility in KHIS Aggregate. This is may be caused by the " "existance of an organisation unit with as similar name as to the one you are creating. KHIS Error: {}".format(r.text) ] From a7f585d5eb04dccc89a8c117c5b43cca2bf2befd Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 17:45:31 +0300 Subject: [PATCH 27/50] Updated line 1405 of facility_models.py --- facilities/models/facility_models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index e9443660..ac974b0f 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -1403,6 +1403,7 @@ def push_new_facility(self, code=None): # LOGGER.info("[DEBUG] new_facility: {}".format(new_facility)) raise ValueError("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) + if dhis2_org_unit_id[1] == 'retrieved': new_facility = False From 689ebe99db1b639dc21675bb7dcc565aac295e6e Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 18:10:47 +0300 Subject: [PATCH 28/50] DEBUG hotfix update --- facilities/models/facility_models.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index ac974b0f..1fdd22ec 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -1400,7 +1400,8 @@ def push_new_facility(self, code=None): new_facility = True - # LOGGER.info("[DEBUG] new_facility: {}".format(new_facility)) + LOGGER.error("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) + raise ValueError("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) @@ -2297,8 +2298,8 @@ def push_facility_updates(self): re.search(r'\((.*?)\)', str(FacilityCoordinates.objects.values('coordinates') .get(facility_id=self.facility.id)['coordinates'])).group(1)) - LOGGER.error('[>>>>>Info] coordinates: {}, FacilityCoordinatesObj: {}'.format(coordinates, FacilityCoordinates.objects.values('coordinates') - .get(facility_id=self.facility.id)['coordinates'])) + # LOGGER.error('[>>>>>Info] coordinates: {}, FacilityCoordinatesObj: {}'.format(coordinates, FacilityCoordinates.objects.values('coordinates') + # .get(facility_id=self.facility.id)['coordinates'])) new_facility_updates_payload = { "code": str(self.facility.code), From 051bff05d26556bab6195f7ca206cb3b37304403 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 19:30:01 +0300 Subject: [PATCH 29/50] Updates lines 1406-1407 --- facilities/models/facility_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 1fdd22ec..51a1900e 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -187,6 +187,7 @@ def get_parent_id(self, ward_id): return dhis2_facility[0]["id"] def push_facility_to_dhis2(self, new_facility_payload, new_facility): + if new_facility: r = requests.post( settings.DHIS_ENDPOINT+"api/organisationUnits", @@ -1402,7 +1403,6 @@ def push_new_facility(self, code=None): LOGGER.error("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) - raise ValueError("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) From 0787d18bb88ab9e7a2dc505c32105e5b945d23f1 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 19:30:44 +0300 Subject: [PATCH 30/50] Updates lines 1406-1407 --- facilities/models/facility_models.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 51a1900e..29079acb 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -187,7 +187,7 @@ def get_parent_id(self, ward_id): return dhis2_facility[0]["id"] def push_facility_to_dhis2(self, new_facility_payload, new_facility): - + if new_facility: r = requests.post( settings.DHIS_ENDPOINT+"api/organisationUnits", @@ -1378,6 +1378,7 @@ def push_new_facility(self, code=None): facility_code = str(code) else: facility_code = str(self.code) + new_facility_payload = { "id": dhis2_org_unit_id[0], "code": facility_code, @@ -1392,6 +1393,7 @@ def push_new_facility(self, code=None): re.search(r'\((.*?)\)', str(FacilityCoordinates.objects.values('coordinates') .get(facility_id=self.id)['coordinates'])).group(1)) } + metadata_payload = { "facility_type": kmhfl_dhis2_facility_type_mapping[str(self.facility_type_id)], "keph": kmhfl_dhis2_keph_mapping[str(self.keph_level_id)], From 0268fa3db16742b4f78dbaf6ee4ed974c4ba9f5d Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 19:41:37 +0300 Subject: [PATCH 31/50] Refactored line 2331 --- facilities/models/facility_models.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 29079acb..449e5bb7 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -1378,7 +1378,7 @@ def push_new_facility(self, code=None): facility_code = str(code) else: facility_code = str(self.code) - + new_facility_payload = { "id": dhis2_org_unit_id[0], "code": facility_code, @@ -1403,9 +1403,9 @@ def push_new_facility(self, code=None): new_facility = True - LOGGER.error("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) + # LOGGER.error("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) - raise ValueError("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) + # raise ValueError("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) if dhis2_org_unit_id[1] == 'retrieved': @@ -2317,8 +2317,18 @@ def push_facility_updates(self): # print("Names;", "Official Name:", self.facility.official_name, "Name:", self.facility.name) # + + # LOGGER.error("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) + + # raise ValueError("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) + print("New Facility Push Payload => ", new_facility_updates_payload) - new_facility = False if dhis2_org_unit_id[1] == 'retrived' else True + + # LOGGER.error("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) + + # raise ValueError("[DEBUG] dhis2_org_unit_id[1]{}:".format(dhis2_org_unit_id[1])) + + new_facility = False if dhis2_org_unit_id[1] == 'retrieved' else True self.dhis2_api_auth.push_facility_to_dhis2(new_facility_updates_payload, new_facility) From 8bedb012840f8f5eedf0573897062d604098016d Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 19:52:38 +0300 Subject: [PATCH 32/50] Refactored line 277 --- facilities/models/facility_models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 449e5bb7..1bdc2992 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -213,7 +213,7 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility): ) else: facility = requests.get( - settings.DHIS_ENDPOINT + "api/organisationUnits/" + new_facility_payload.pop('id'), + settings.DHIS_ENDPOINT + "api/organisationUnits/" + new_facility_payload['id'], auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), headers={ "Accept": "application/json" @@ -222,9 +222,9 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility): ) - if facility.json()['id'] == new_facility_payload.pop('id'): + if facility.json()['id'] == new_facility_payload['id']: r = requests.put( - settings.DHIS_ENDPOINT + "api/organisationUnits/" + new_facility_payload.pop('id'), + settings.DHIS_ENDPOINT + "api/organisationUnits/" + new_facility_payload['id'], auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), headers={ "Accept": "application/json" From 8e3ed6b5d80287d68a6ed838d5b0b2e82492f0a6 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 19:57:06 +0300 Subject: [PATCH 33/50] Refactored line 215-216 --- facilities/models/facility_models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 1bdc2992..2a109b76 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -212,6 +212,9 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility): } ) else: + LOGGER.error("new_facility_payload:{}".format(new_facility_payload)) + raise ValueError("new_facility_payload:{}".format(new_facility_payload)) + facility = requests.get( settings.DHIS_ENDPOINT + "api/organisationUnits/" + new_facility_payload['id'], auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), From 3433e987513657ffb403c57fd3f5a43e1aaab10b Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 20:03:00 +0300 Subject: [PATCH 34/50] Refactored line 215-222 --- facilities/models/facility_models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 2a109b76..243b8939 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -212,8 +212,8 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility): } ) else: - LOGGER.error("new_facility_payload:{}".format(new_facility_payload)) - raise ValueError("new_facility_payload:{}".format(new_facility_payload)) + LOGGER.error("new_facility_payload:{}".format(new_facility_payload['id'])) + # raise ValueError("new_facility_payload:{}".format(new_facility_payload)) facility = requests.get( settings.DHIS_ENDPOINT + "api/organisationUnits/" + new_facility_payload['id'], @@ -2307,6 +2307,7 @@ def push_facility_updates(self): # .get(facility_id=self.facility.id)['coordinates'])) new_facility_updates_payload = { + "id": dhis2_org_unit_id[0], "code": str(self.facility.code), "name": str(self.facility.name), "shortName": str(self.facility.name), From 661db9ed3ef98a551d32d70e80a9bbf269efe40a Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Aug 2024 20:10:00 +0300 Subject: [PATCH 35/50] Fixed the facility validation issue --- facilities/models/facility_models.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index 243b8939..a455f932 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -205,14 +205,13 @@ def push_facility_to_dhis2(self, new_facility_payload, new_facility): raise ValidationError( { "Error!": [ - "[DEBUG] new_facility: {}; [DEBUG] new_facility_payload: {}".format(new_facility, new_facility_payload), "An error occured while creating the facility in KHIS Aggregate. This is may be caused by the " "existance of an organisation unit with as similar name as to the one you are creating. KHIS Error: {}".format(r.text) ] } ) else: - LOGGER.error("new_facility_payload:{}".format(new_facility_payload['id'])) + # LOGGER.error("new_facility_payload:{}".format(new_facility_payload['id'])) # raise ValueError("new_facility_payload:{}".format(new_facility_payload)) facility = requests.get( @@ -302,8 +301,8 @@ def push_facility_updates_to_dhis2(self, org_unit_id, facility_updates_payload): ) - print("Update Facility Response", r.url, r.status_code, r.json()) - LOGGER.info('[DEBUG]: parent_id: {} \n [DEBUG]: payload: {} \n [DEBUG]: response: {}'.format(org_unit_id, facility_updates_payload, r.json())) + # print("Update Facility Response", r.url, r.status_code, r.json()) + # LOGGER.info('[DEBUG]: parent_id: {} \n [DEBUG]: payload: {} \n [DEBUG]: response: {}'.format(org_unit_id, facility_updates_payload, r.json())) if r.json()["status"] != "OK": From d93466213a2f84a845c1a52cc9f13ffbf2c774ff Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 6 Aug 2024 11:01:57 +0300 Subject: [PATCH 36/50] Added linked facility code check and a validation Error if facility code does not exist --- chul/models.py | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/chul/models.py b/chul/models.py index 85cd843e..47754284 100755 --- a/chul/models.py +++ b/chul/models.py @@ -389,30 +389,34 @@ def push_chu_metadata(self, metadata_payload, chu_uid): def get_facility_dhis2_parent_id(self): from facilities.models.facility_models import DhisAuth import requests - r = requests.get( - settings.DHIS_ENDPOINT + "api/organisationUnits.json", - auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), - headers={ - "Accept": "application/json" - }, - params={ - "query": self.facility.code, - "fields": "id,name", - "filter": "level:in:[5]", - "paging": "false" - } - ) - if len(r.json()["organisationUnits"]) is 1 and "id" in r.json()["organisationUnits"][0]: - if r.json()["organisationUnits"][0]["id"]: - return r.json()["organisationUnits"][0]["id"] - else: - raise ValidationError( - { - "Error!": ["Unable to resolve exact Facility linked to the CHU in DHIS2"] + if self.facility.code: + r = requests.get( + settings.DHIS_ENDPOINT + "api/organisationUnits.json", + auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), + headers={ + "Accept": "application/json" + }, + params={ + "query": self.facility.code, + "fields": "id,name", + "filter": "level:in:[5]", + "paging": "false" } ) + if len(r.json()["organisationUnits"]) is 1 and "id" in r.json()["organisationUnits"][0]: + if r.json()["organisationUnits"][0]["id"]: + return r.json()["organisationUnits"][0]["id"] + else: + raise ValidationError( + { + "Error!": ["Unable to find facility with code {} in KHIS. KHIS Response {}".format(self.facility.code, r.text)] + } + ) + else: + raise ValidationError("The linked facility for this CU does not have an MFL code. Therefore it is not in KHIS ") + class Meta(AbstractBase.Meta): unique_together = ('name', 'facility',) From 59fea08f882c18bf1a58529df9a90a82d52f8fb7 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 6 Aug 2024 11:12:40 +0300 Subject: [PATCH 37/50] Added linked facility code check and a validation Error if facility code does not exist --- chul/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chul/models.py b/chul/models.py index 47754284..22a09486 100755 --- a/chul/models.py +++ b/chul/models.py @@ -387,7 +387,7 @@ def push_chu_metadata(self, metadata_payload, chu_uid): LOGGER.info('Metadata CUs pushed successfullly') def get_facility_dhis2_parent_id(self): - from facilities.models.facility_models import DhisAuth + # from facilities.models.facility_models import DhisAuth import requests if self.facility.code: From e60f285dab6023afff13c08b2257fae498ee72a2 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 6 Aug 2024 11:30:41 +0300 Subject: [PATCH 38/50] Updated push_chu_to_dhis2 in mf-api-prod --- chul/models.py | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/chul/models.py b/chul/models.py index 22a09486..bef311e9 100755 --- a/chul/models.py +++ b/chul/models.py @@ -304,12 +304,15 @@ def average_rating(self): def rating_count(self): return self.chu_ratings.count() - def push_chu_to_dhis2(self): + def push_chu_to_dhis2(self): from facilities.models.facility_models import DhisAuth import requests + + LOGGER.error("[DEBUG] self: {}\n".format(self)) + dhisauth = DhisAuth() dhisauth.get_oauth2_token() - facility_dhis_id = self.get_facility_dhis2_parent_id() if self.facility.reporting_in_dhis else None + facility_dhis_id = self.get_facility_dhis2_parent_id() # if self.facility.reporting_in_dhis else None unit_uuid_status = dhisauth.get_org_unit_id(self.code) unit_uuid = unit_uuid_status[0] new_chu_payload = { @@ -330,8 +333,7 @@ def push_chu_to_dhis2(self): if facility_dhis_id is not None: if unit_uuid_status[1] == 'retrieved': - LOGGER.info("[>>>>>] Retrieved CHU") - + r = requests.put( settings.DHIS_ENDPOINT + "api/organisationUnits/" + new_chu_payload.pop('id'), auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), @@ -340,10 +342,12 @@ def push_chu_to_dhis2(self): }, json=new_chu_payload ) - print("Update CHU Response", r.url, r.status_code, r.json()) - LOGGER.info("Update CHU Response: %s" % r.text) + + LOGGER.info("[DEBUG] Response(retrived): {}".format(r.text)) + + else: - LOGGER.info("[>>>>>] Payload for new CHU: {}".format(new_chu_payload)); + r = requests.post( settings.DHIS_ENDPOINT + "api/organisationUnits", auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), @@ -353,20 +357,24 @@ def push_chu_to_dhis2(self): json=new_chu_payload ) - print("Create CHU Response", r.url, r.status_code, r.json()) - LOGGER.info("Create CHU Response: %s" % r.text) + LOGGER.info("[DEBUG] Response(generated): {}".format(r.text)) - if r.json()["status"] != "OK": - LOGGER.error("Failed PUSH: error -> {}".format(r.text)) - raise ValidationError( - { - "Error!": ["An error occured while pushing Community Unit to DHIS2. This is may be caused by the " - "existance of an organisation unit with as similar name as to the one you are creating. " - "Or some specific information like codes are not unique"] - } - ) - self.push_chu_metadata(metadata_payload, unit_uuid) + + + if r.json()["status"] != "OK": + LOGGER.error("[DEBUG]: Repsonse(error):{}".format(r.text)) + + raise ValidationError( + { + "Error!": ["An error occured while pushing Community Unit to DHIS2. This is may be caused by the " + "existance of an organisation unit with as similar name as to the one you are creating. " + "Or some specific information like codes are not unique"] + } + ) + self.push_chu_metadata(metadata_payload, unit_uuid) else: + LOGGER.error("[DEBUG] facility_dhis_id: {}".format(facility_dhis_id)) + raise ValidationError( { "Error!": ["Could not find Facility DHIS ID, when pushing CU to DHIS"] From 9b88948072aaf75f3f9c465c02c02b0a8e4850ad Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 6 Aug 2024 11:30:48 +0300 Subject: [PATCH 39/50] Updated push_chu_to_dhis2 in mf-api-prod --- chul/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chul/models.py b/chul/models.py index bef311e9..02f85816 100755 --- a/chul/models.py +++ b/chul/models.py @@ -304,7 +304,7 @@ def average_rating(self): def rating_count(self): return self.chu_ratings.count() - def push_chu_to_dhis2(self): + def push_chu_to_dhis2(self): from facilities.models.facility_models import DhisAuth import requests @@ -374,7 +374,7 @@ def push_chu_to_dhis2(self): self.push_chu_metadata(metadata_payload, unit_uuid) else: LOGGER.error("[DEBUG] facility_dhis_id: {}".format(facility_dhis_id)) - + raise ValidationError( { "Error!": ["Could not find Facility DHIS ID, when pushing CU to DHIS"] From e463757e05c388a6d87ccf5d052aa801e2d6a50f Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 6 Aug 2024 14:35:46 +0300 Subject: [PATCH 40/50] Fixed issue of CHU not submitting --- chul/models.py | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/chul/models.py b/chul/models.py index 02f85816..7c2ec046 100755 --- a/chul/models.py +++ b/chul/models.py @@ -304,14 +304,14 @@ def average_rating(self): def rating_count(self): return self.chu_ratings.count() + def push_chu_to_dhis2(self): from facilities.models.facility_models import DhisAuth import requests - LOGGER.error("[DEBUG] self: {}\n".format(self)) - dhisauth = DhisAuth() dhisauth.get_oauth2_token() + facility_dhis_id = self.get_facility_dhis2_parent_id() # if self.facility.reporting_in_dhis else None unit_uuid_status = dhisauth.get_org_unit_id(self.code) unit_uuid = unit_uuid_status[0] @@ -394,11 +394,14 @@ def push_chu_metadata(self, metadata_payload, chu_uid): ) LOGGER.info('Metadata CUs pushed successfullly') + + + def get_facility_dhis2_parent_id(self): # from facilities.models.facility_models import DhisAuth import requests - if self.facility.code: + if hasattr(self, "facility") and hasattr(self.facility, "code"): r = requests.get( settings.DHIS_ENDPOINT + "api/organisationUnits.json", auth=(settings.DHIS_USERNAME, settings.DHIS_PASSWORD), @@ -414,16 +417,19 @@ def get_facility_dhis2_parent_id(self): ) if len(r.json()["organisationUnits"]) is 1 and "id" in r.json()["organisationUnits"][0]: - if r.json()["organisationUnits"][0]["id"]: - return r.json()["organisationUnits"][0]["id"] + if r.json()["organisationUnits"][0]["id"]: + return r.json()["organisationUnits"][0]["id"] else: raise ValidationError( { - "Error!": ["Unable to find facility with code {} in KHIS. KHIS Response {}".format(self.facility.code, r.text)] + "Error!": ["Unable to find facility with code {} in KHIS.".format(self.facility.code)] } ) else: - raise ValidationError("The linked facility for this CU does not have an MFL code. Therefore it is not in KHIS ") + raise ValidationError({ + "Error": ["The linked facility for this CU does not have an MFL code. Therefore it is not in KHIS"] + }) + class Meta(AbstractBase.Meta): @@ -556,34 +562,44 @@ def update_basic_details(self): 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 key is not "basic": + setattr(self.health_unit, key, value) if 'basic' in basic_details: - setattr(self.health_unit, 'facility_id', basic_details.get('basic').get('facility')) + if 'basic' in basic_details.get('basic'): + if 'facility' in basic_details.get('basic').get('basic'): + setattr(self.health_unit, 'facility_id', basic_details.get('basic').get('basic').get('facility')) + else: + if 'facility' in basic_details.get('basic'): + 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) + for chew in chews: chew['health_unit'] = self.health_unit chew['created_by_id'] = self.created_by_id chew['updated_by_id'] = self.updated_by_id chew.pop('created_by', None) chew.pop('updated_by', None) - if 'id' in chew: + + if hasattr(chew, 'id'): chew_obj = CommunityHealthWorker.objects.get( id=chew['id']) chew_obj.first_name = chew['first_name'] chew_obj.last_name = chew['last_name'] - if 'is_incharge' in chew: + if hasattr(chew, 'is_incharge'): chew_obj.is_incharge = chew['is_incharge'] chew_obj.save() else: CommunityHealthWorker.objects.create(**chew) def update_services(self): + services = json.loads(self.services) CHUServiceLink.objects.filter(health_unit=self.health_unit).delete() for service in services: @@ -632,9 +648,11 @@ def update_contacts(self): @property def updates(self): updates = {} + if self.basic and self.basic is not None: json_basic = json.loads(self.basic) - updates['basic'] = json_basic['basic'] if 'basic' in json_basic else json_basic + updates['basic'] = json_basic['basic'] if hasattr(json_basic, 'basic') else json_basic + if self.contacts: updates['contacts'] = json.loads(self.contacts) if self.workers: @@ -643,6 +661,7 @@ def updates(self): updates['services'] = json.loads(self.services) updates['updated_by'] = self.updated_by.get_full_name return updates + def clean(self, *args, **kwargs): if not self.is_approved and not self.is_rejected: From a8b8d1713354667e9b3d1e1d215a411187ba59b9 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 7 Aug 2024 14:29:13 +0300 Subject: [PATCH 41/50] Updated filter_unpublished_facilities_national_level and facilities_pending_approval --- facilities/filters/facility_filters.py | 46 +++++++++++++++++--------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/facilities/filters/facility_filters.py b/facilities/filters/facility_filters.py index 92b2fa56..b0cef578 100755 --- a/facilities/filters/facility_filters.py +++ b/facilities/filters/facility_filters.py @@ -407,17 +407,28 @@ def filter_unpublished_facilities_national_level(self, qs, name, value): This is in order to allow the facilities to be seen so that they can be approved at the national level and assigned an MFL code. """ - - incomplete_facilities = [facility.id for facility in qs.filter(code=None) if not facility.is_complete] if value in TRUTH_NESS: - return qs.filter( - approved_national_level=None, approved=True, has_edits=False, closed=False, rejected=False, - ).exclude(id__in=incomplete_facilities) + pending_approval_qs = qs.filter( + Q(Q(approved_national_level=None) | Q(approved_national_level=False)), + approved=True, + has_edits=False, + closed=False, + rejected=False + ) + + incomplete_pending_approval_ids = [facility.id for facility in pending_approval_qs if not facility.is_complete] + + return pending_approval_qs.exclude(id__in=incomplete_pending_approval_ids) + else: - return qs.filter( + approved_qs = qs.filter( approved_national_level=True, approved=True, has_edits=False, closed=False, rejected=False, - ).exclude(id__in=incomplete_facilities) + ) + + incomplete_approved_qs = [facility.id for facility in approved_qs if not facility.is_complete] + + return approved_qs.exclude(id__in=incomplete_approved_qs) def filter_incomplete_facilities(self, qs, name, value): """ @@ -431,24 +442,29 @@ def filter_incomplete_facilities(self, qs, name, value): return qs.exclude(id__in=incomplete_facilities) def facilities_pending_approval(self, qs, name, value): - # incomplete = qs.filter(code=not None) - # incomplete_facility_ids = [facility.id for facility in incomplete] - incomplete_facilities = [facility.id for facility in qs.filter(code=None) if not facility.is_complete] + if value in TRUTH_NESS: - return qs.filter( - Q( + pending_validation_qs = qs.filter( has_edits=False, approved=None, rejected=False, approved_national_level=None - )).exclude(id__in=incomplete_facilities) + ) + + incomplete_pending_validation_ids = [facility.id for facility in pending_validation_qs if not facility.is_complete] + + return pending_validation_qs.exclude(id__in=incomplete_pending_validation_ids) else: - return qs.filter( + validated_qs = qs.filter( rejected=False, has_edits=False, approved=True, approved_national_level=None - ).exclude(id__in=incomplete_facilities) + ) + + incomplete_validated_ids = [facility.id for facility in pending_validation_qs if not facility.is_complete] + + return validated_qs.exclude(id__in=incomplete_validated_ids) def filter_national_rejected(self, qs, name, value): From 0135a3b8ecf7605d31802cabf6747b4e63dd1823 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 7 Aug 2024 14:37:44 +0300 Subject: [PATCH 42/50] Updated line 465 of facilities_filters.py --- facilities/filters/facility_filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facilities/filters/facility_filters.py b/facilities/filters/facility_filters.py index b0cef578..fad25377 100755 --- a/facilities/filters/facility_filters.py +++ b/facilities/filters/facility_filters.py @@ -462,7 +462,7 @@ def facilities_pending_approval(self, qs, name, value): approved_national_level=None ) - incomplete_validated_ids = [facility.id for facility in pending_validation_qs if not facility.is_complete] + incomplete_validated_ids = [facility.id for facility in validated_qs if not facility.is_complete] return validated_qs.exclude(id__in=incomplete_validated_ids) From 9fd5483e32dfb64f3ceaf0447a7be166458c72c0 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 7 Aug 2024 16:24:28 +0300 Subject: [PATCH 43/50] Updated line 418 of facility_filters --- facilities/filters/facility_filters.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/facilities/filters/facility_filters.py b/facilities/filters/facility_filters.py index fad25377..ee8afbbf 100755 --- a/facilities/filters/facility_filters.py +++ b/facilities/filters/facility_filters.py @@ -414,7 +414,8 @@ def filter_unpublished_facilities_national_level(self, qs, name, value): approved=True, has_edits=False, closed=False, - rejected=False + rejected=False, + code=None ) incomplete_pending_approval_ids = [facility.id for facility in pending_approval_qs if not facility.is_complete] @@ -423,7 +424,7 @@ def filter_unpublished_facilities_national_level(self, qs, name, value): else: approved_qs = qs.filter( - approved_national_level=True, approved=True, has_edits=False, closed=False, rejected=False, + approved_national_level=True, approved=True, has_edits=False, closed=False, rejected=False ) incomplete_approved_qs = [facility.id for facility in approved_qs if not facility.is_complete] @@ -448,7 +449,8 @@ def facilities_pending_approval(self, qs, name, value): has_edits=False, approved=None, rejected=False, - approved_national_level=None + approved_national_level=None, + code=None ) incomplete_pending_validation_ids = [facility.id for facility in pending_validation_qs if not facility.is_complete] From 3683a6f58735aa0ab857d38b10af726c9ce7cce4 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 8 Aug 2024 14:42:22 +0300 Subject: [PATCH 44/50] Added filter_facilities_with_pending_updates method to FacilityFilter class in facility_filters.py --- facilities/filters/facility_filters.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/facilities/filters/facility_filters.py b/facilities/filters/facility_filters.py index ee8afbbf..84ca4517 100755 --- a/facilities/filters/facility_filters.py +++ b/facilities/filters/facility_filters.py @@ -401,6 +401,15 @@ def filter_approved_facilities(self, qs, name, value): return qs.filter(Q(approved=True)) else: return qs.filter(Q(approved=None) | Q(rejected=True)) + + def filter_facilities_with_pending_updates(self, qs, name, value): + + if value in TRUTH_NESS: + facilities_pending_updates = qs.filter(has_edits=True) + + facilities_latest_updates_ids = [f.id for f in facilities_pending_updates if f.latest_update is None] + + return facilities_pending_updates.exclude(id__in=facilities_latest_updates_ids) def filter_unpublished_facilities_national_level(self, qs, name, value): """ @@ -561,6 +570,8 @@ def filter_number_cots(self, qs, name, value): method='filter_incomplete_facilities') to_publish = django_filters.CharFilter( method='filter_unpublished_facilities_national_level') + have_updates = django_filters.CharFilter( + method='filter_facilities_with_pending_updates') approved_national_level = django_filters.TypedChoiceFilter( choices=BOOLEAN_CHOICES, coerce=strtobool) From e77331543334e5a9d9de2826d5550969743ab8ae Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 9 Aug 2024 12:17:32 +0300 Subject: [PATCH 45/50] Fixed filter for incomplete facilities --- facilities/filters/facility_filters.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/facilities/filters/facility_filters.py b/facilities/filters/facility_filters.py index 84ca4517..f515b0a4 100755 --- a/facilities/filters/facility_filters.py +++ b/facilities/filters/facility_filters.py @@ -407,9 +407,11 @@ def filter_facilities_with_pending_updates(self, qs, name, value): if value in TRUTH_NESS: facilities_pending_updates = qs.filter(has_edits=True) - facilities_latest_updates_ids = [f.id for f in facilities_pending_updates if f.latest_update is None] + # facilities_latest_updates_ids = [f.id for f in facilities_pending_updates if f.latest_update is None] - return facilities_pending_updates.exclude(id__in=facilities_latest_updates_ids) + # return facilities_pending_updates.exclude(id__in=facilities_latest_updates_ids) + + return facilities_pending_updates def filter_unpublished_facilities_national_level(self, qs, name, value): """ @@ -444,12 +446,13 @@ def filter_incomplete_facilities(self, qs, name, value): """ Filter the incomplete/complete facilities """ - incomplete_facilities = [facility for facility in qs.filter() if not facility.is_complete] if value in TRUTH_NESS: - return incomplete_facilities + complete_facilities_ids = [facility.id for facility in qs.all() if facility.is_complete] + return qs.all().exclude(id__in=complete_facilities_ids) else: - return qs.exclude(id__in=incomplete_facilities) + incomplete_facilities_ids = [facility.id for facility in qs.all() if not facility.is_complete] + return qs.all().exclude(id__in=incomplete_facilities_ids) def facilities_pending_approval(self, qs, name, value): From aa09d6c963edcb2ca2d77acf3092fa0cade4f5c2 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 9 Aug 2024 12:26:33 +0300 Subject: [PATCH 46/50] Improved function filter_incomplete_facilities --- facilities/filters/facility_filters.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/facilities/filters/facility_filters.py b/facilities/filters/facility_filters.py index f515b0a4..d00b47d9 100755 --- a/facilities/filters/facility_filters.py +++ b/facilities/filters/facility_filters.py @@ -407,11 +407,9 @@ def filter_facilities_with_pending_updates(self, qs, name, value): if value in TRUTH_NESS: facilities_pending_updates = qs.filter(has_edits=True) - # facilities_latest_updates_ids = [f.id for f in facilities_pending_updates if f.latest_update is None] + facilities_latest_updates_ids = [f.id for f in facilities_pending_updates if f.latest_update is None] - # return facilities_pending_updates.exclude(id__in=facilities_latest_updates_ids) - - return facilities_pending_updates + return facilities_pending_updates.exclude(id__in=facilities_latest_updates_ids) def filter_unpublished_facilities_national_level(self, qs, name, value): """ @@ -447,12 +445,13 @@ def filter_incomplete_facilities(self, qs, name, value): Filter the incomplete/complete facilities """ + all_facilities = qs.all() if value in TRUTH_NESS: - complete_facilities_ids = [facility.id for facility in qs.all() if facility.is_complete] - return qs.all().exclude(id__in=complete_facilities_ids) + complete_facilities_ids = [facility.id for facility in all_facilities if facility.is_complete] + return all_facilities.exclude(id__in=complete_facilities_ids) else: - incomplete_facilities_ids = [facility.id for facility in qs.all() if not facility.is_complete] - return qs.all().exclude(id__in=incomplete_facilities_ids) + incomplete_facilities_ids = [facility.id for facility in all_facilities if not facility.is_complete] + return all_facilities.exclude(id__in=incomplete_facilities_ids) def facilities_pending_approval(self, qs, name, value): From 998a06b8b21d46d011f15b040372b89dfd490c5a Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 9 Aug 2024 14:43:24 +0300 Subject: [PATCH 47/50] Updated chul/serializer.py; buffer_updates method of CommunityHealthUnitSerializer --- chul/serializers.py | 73 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/chul/serializers.py b/chul/serializers.py index 5e59b0ef..7b1d0411 100755 --- a/chul/serializers.py +++ b/chul/serializers.py @@ -119,14 +119,18 @@ def buffer_updates( services=None): try: - chu_updates = ChuUpdateBuffer.objects.filter( + update = ChuUpdateBuffer.objects.get( health_unit=chu_instance, - is_approved=False, is_rejected=False) + is_approved=False, is_rejected=False) if len(ChuUpdateBuffer.objects.filter( + health_unit=chu_instance, + is_approved=False, is_rejected=False)) == 1 else ChuUpdateBuffer.objects.filter( + health_unit=chu_instance, + is_approved=False, is_rejected=False)[0] if len(ChuUpdateBuffer.objects.filter( + health_unit=chu_instance, + is_approved=False, is_rejected=False)) > 1 else None - update = chu_updates[0] if chu_updates.__len__() > 0 else None - if update is None: - raise ChuUpdateBuffer.DoesNotExist + raise ChuUpdateBuffer.DoesNotExist except ChuUpdateBuffer.DoesNotExist: update = ChuUpdateBuffer.objects.create( @@ -172,6 +176,65 @@ def buffer_updates( update.contacts = contacts update.save() + # Previous lateest commit: mfr-api-prod + # def buffer_updates( + # self, validated_data, chu_instance, chews=None, contacts=None, + # services=None): + + # try: + # chu_updates = ChuUpdateBuffer.objects.filter( + # health_unit=chu_instance, + # is_approved=False, is_rejected=False) + + # update = chu_updates[0] if chu_updates.__len__() > 0 else None + + # if update is None: + # raise ChuUpdateBuffer.DoesNotExist + + # except ChuUpdateBuffer.DoesNotExist: + # update = ChuUpdateBuffer.objects.create( + # health_unit=chu_instance, + # created_by_id=self.context['request'].user.id, + # updated_by_id=self.context['request'].user.id, + # is_new=True) + # basic_updates = self.get_basic_updates(chu_instance, validated_data) + + # update.basic = basic_updates if basic_updates \ + # and not update.basic else update.basic + + # if chews: + # for chew in chews: + # chew.pop('created', None) + # chew.pop('updated', None) + # chew.pop('updated_by', None) + # chew.pop('created_by', None) + + # chews = json.dumps(chews) + # update.workers = chews + + # if services: + # for service in services: + # sev_rec = CHUService.objects.get(id=service['service']) + # service.pop('created', None) + # service.pop('updated', None) + # service.pop('updated_by', None) + # service.pop('created_by', None) + # service['name'] = sev_rec.name + + # services = json.dumps(services) + # update.services = services + + # if contacts: + # for contact in contacts: + # contact_type = ContactType.objects.get( + # id=contact['contact_type']) + # contact['contact_type_name'] = contact_type.name + + # contacts = json.dumps(contacts) + + # update.contacts = contacts + # update.save() + def _ensure_all_chew_required_provided(self, chew): if 'first_name' and 'last_name' not in chew: self.inlined_errors.update({ From 673c18d36bc4f05b2a604a13bb5b6ca60dac1935 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 9 Aug 2024 14:46:29 +0300 Subject: [PATCH 48/50] Updated facility_filters line 493 --- facilities/filters/facility_filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facilities/filters/facility_filters.py b/facilities/filters/facility_filters.py index d00b47d9..30fa44b0 100755 --- a/facilities/filters/facility_filters.py +++ b/facilities/filters/facility_filters.py @@ -493,7 +493,7 @@ def filter_number_beds(self, qs, name, value): return qs.filter(number_of_beds__gte=1) def filter_number_cots(self, qs, name, value): - return self.filter(number_of_cots__gte=1) + return qs.filter(number_of_cots__gte=1) id = ListCharFilter(lookup_expr='icontains') name = django_filters.CharFilter(lookup_expr='icontains') From b0edcf8513bf35e8eeb647a44d06543c7a67d376 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 9 Aug 2024 14:57:04 +0300 Subject: [PATCH 49/50] Updated line 1051; all commented lines --- facilities/models/facility_models.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/facilities/models/facility_models.py b/facilities/models/facility_models.py index a455f932..f5f7c4d5 100755 --- a/facilities/models/facility_models.py +++ b/facilities/models/facility_models.py @@ -1048,12 +1048,7 @@ class FacilityExportExcelMaterialView(models.Model): long = models.CharField(max_length=30, null=True, blank=True) lat = models.CharField(max_length=30, null=True, blank=True) approved_national_level = models.BooleanField(default=False) - # number_of_minor_theatres = models.PositiveIntegerField( - # default=0) - # number_of_eye_theatres = models.PositiveIntegerField( - # default=0) - # new_born_unit = models.BooleanField(default=False) - # out_reach_services = models.BooleanField(default=False) + class Meta(object): managed = False ordering = ('-created', ) From 3fd57227cbc9f7217cbc17215eaaa2fa481880c1 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 4 Sep 2024 15:13:06 +0300 Subject: [PATCH 50/50] Debug: facility_views.py line 660 --- facilities/views/facility_views.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/facilities/views/facility_views.py b/facilities/views/facility_views.py index 6ee387bd..39211731 100755 --- a/facilities/views/facility_views.py +++ b/facilities/views/facility_views.py @@ -1,4 +1,5 @@ import json +import logging from django.utils import timezone from rest_framework import generics, status @@ -8,6 +9,7 @@ from common.views import AuditableDetailViewMixin from common.utilities import CustomRetrieveUpdateDestroyView + from common.models import ( ContactType, UserConstituency, UserCounty, UserSubCounty ) @@ -94,6 +96,8 @@ ) +LOGGER = logging.getLogger(__name__) + class QuerysetFilterMixin(object): """ Filter that only allows users to list facilities in their county @@ -653,8 +657,9 @@ def populate_officer_incharge_contacts(self, officer_in_charge): Resolves the contact_type_name for the officer_in_charge contacts """ for contact in officer_in_charge['contacts']: + LOGGER.info('contact: {}'.format(contact)) contact['contact_type_name'] = ContactType.objects.get( - id=contact.get('type')).name + id=contact.get('contact_type')).name return officer_in_charge def populate_officer_incharge_job_title(self, officer_in_charge):