Skip to content

Commit 6353e01

Browse files
committed
no message
1 parent 46e064e commit 6353e01

File tree

7 files changed

+58
-55
lines changed

7 files changed

+58
-55
lines changed

src/hct_mis_api/apps/core/utils.py

+23-21
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@
4646
from openpyxl.worksheet.worksheet import Worksheet
4747

4848
from hct_mis_api.apps.account.models import User
49+
from hct_mis_api.apps.geo.models import Area
50+
from hct_mis_api.apps.household.models import Household
4951

5052
logger = logging.getLogger(__name__)
5153

5254

5355
class CaseInsensitiveTuple(tuple):
5456
def __contains__( # type: ignore # FIXME Signature of "__contains__" incompatible with supertype tuple
55-
self, key: str, *args: Any, **kwargs: Any
57+
self, key: str, *args: Any, **kwargs: Any
5658
) -> bool:
5759
return key.casefold() in (element.casefold() for element in self)
5860

@@ -92,11 +94,11 @@ def get_program_id_from_headers(headers: Union[Dict, "HttpHeaders"]) -> Optional
9294

9395

9496
def unique_slugify(
95-
instance: "Model",
96-
value: Any,
97-
slug_field_name: str = "slug",
98-
queryset: Optional["QuerySet"] = None,
99-
slug_separator: str = "-",
97+
instance: "Model",
98+
value: Any,
99+
slug_field_name: str = "slug",
100+
queryset: Optional["QuerySet"] = None,
101+
slug_separator: str = "-",
100102
) -> None:
101103
"""
102104
Calculates and stores a unique slug of ``value`` for an instance.
@@ -323,7 +325,7 @@ def encode_ids(results: Any, model_name: str, key: str) -> List[Dict]:
323325

324326

325327
def to_dict(
326-
instance: "Model", fields: Union[List, Tuple, None] = None, dict_fields: Optional[Dict] = None
328+
instance: "Model", fields: Union[List, Tuple, None] = None, dict_fields: Optional[Dict] = None
327329
) -> Dict[str, Any]:
328330
from django.db.models import Model
329331
from django.forms import model_to_dict
@@ -590,11 +592,11 @@ def xlrd_rows_iterator(sheet: "Worksheet") -> Generator:
590592

591593

592594
def chart_get_filtered_qs(
593-
qs: Any,
594-
year: int,
595-
business_area_slug_filter: Optional[Dict] = None,
596-
additional_filters: Optional[Dict] = None,
597-
year_filter_path: Optional[str] = None,
595+
qs: Any,
596+
year: int,
597+
business_area_slug_filter: Optional[Dict] = None,
598+
additional_filters: Optional[Dict] = None,
599+
year_filter_path: Optional[str] = None,
598600
) -> "QuerySet":
599601
if additional_filters is None:
600602
additional_filters = {}
@@ -626,7 +628,7 @@ def sum_lists_with_values(qs_values: Iterable, list_len: int) -> List[int]:
626628

627629

628630
def chart_permission_decorator(
629-
chart_resolve: Optional[Callable] = None, permissions: Optional[List] = None
631+
chart_resolve: Optional[Callable] = None, permissions: Optional[List] = None
630632
) -> Callable:
631633
if chart_resolve is None:
632634
return functools.partial(chart_permission_decorator, permissions=permissions)
@@ -641,7 +643,7 @@ def resolve_f(*args: Any, **kwargs: Any) -> Any:
641643
business_area = BusinessArea.objects.filter(slug=business_area_slug).first()
642644
program_id = get_program_id_from_headers(resolve_info.context.headers)
643645
if any(
644-
resolve_info.context.user.has_permission(per.name, business_area, program_id) for per in permissions
646+
resolve_info.context.user.has_permission(per.name, business_area, program_id) for per in permissions
645647
):
646648
return chart_resolve(*args, **kwargs)
647649
log_and_raise("Permission Denied")
@@ -657,7 +659,7 @@ def chart_filters_decoder(filters: Dict) -> Dict:
657659

658660

659661
def chart_create_filter_query(
660-
filters: Dict, program_id_path: str = "id", administrative_area_path: str = "admin_areas"
662+
filters: Dict, program_id_path: str = "id", administrative_area_path: str = "admin_areas"
661663
) -> Dict:
662664
filter_query = {}
663665
if program := filters.get("program"):
@@ -673,7 +675,7 @@ def chart_create_filter_query(
673675

674676

675677
def chart_create_filter_query_for_payment_verification_gfk(
676-
filters: Dict, program_id_path: str = "id", administrative_area_path: str = "admin_areas"
678+
filters: Dict, program_id_path: str = "id", administrative_area_path: str = "admin_areas"
677679
) -> Q:
678680
filter_query = Q()
679681
if program := filters.get("program"):
@@ -809,7 +811,7 @@ def timezone_datetime(value: Any) -> datetime:
809811

810812

811813
def save_data_in_cache(
812-
cache_key: str, data_lambda: Callable, timeout: int = 60 * 60 * 24, cache_condition: Optional[Callable] = None
814+
cache_key: str, data_lambda: Callable, timeout: int = 60 * 60 * 24, cache_condition: Optional[Callable] = None
813815
) -> Any:
814816
cache_data = cache.get(cache_key, "NOT_CACHED")
815817
if cache_data == "NOT_CACHED":
@@ -882,7 +884,7 @@ def clear_cache_for_key(key: str) -> None:
882884
def chunks(lst: list, n: int) -> list:
883885
"""Yield successive n-sized chunks from lst."""
884886
for i in range(0, len(lst), n):
885-
yield lst[i: i + n]
887+
yield lst[i : i + n]
886888

887889

888890
def send_email_notification_on_commit(service: Any, user: "User") -> None:
@@ -897,9 +899,9 @@ def send_email_notification_on_commit(service: Any, user: "User") -> None:
897899

898900

899901
def send_email_notification(
900-
service: Any,
901-
user: Optional["User"] = None,
902-
context_kwargs: Optional[Dict] = None,
902+
service: Any,
903+
user: Optional["User"] = None,
904+
context_kwargs: Optional[Dict] = None,
903905
) -> None:
904906
if context_kwargs:
905907
context = service.get_email_context(**context_kwargs)

src/hct_mis_api/apps/household/models.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ def unwithdraw(self) -> None:
594594
self.withdrawn_date = None
595595
self.save()
596596

597-
def set_admin_areas(self, new_admin_area: Area, save: bool = True) -> None:
597+
def set_admin_areas(self, new_admin_area: Optional[Area], save: bool = True) -> None:
598598
"""Propagates admin1,2,3,4 based on admin_area parents"""
599599
admins = ["admin1", "admin2", "admin3", "admin4"]
600600
if not new_admin_area:
@@ -609,7 +609,7 @@ def set_admin_areas(self, new_admin_area: Area, save: bool = True) -> None:
609609
new_admin_area = getattr(new_admin_area, "parent", None)
610610

611611
if save:
612-
self.save(update_fields= admins)
612+
self.save(update_fields=admins)
613613

614614
@property
615615
def sanction_list_possible_match(self) -> bool:

src/hct_mis_api/apps/household/schema.py

+31-26
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@
4242
chart_filters_decoder,
4343
chart_permission_decorator,
4444
encode_ids,
45+
get_lowest_admin_area,
4546
get_model_choices_fields,
4647
get_program_id_from_headers,
4748
resolve_flex_fields_choices_to_string,
4849
sum_lists_with_values,
49-
to_choice_object, get_lowest_admin_area,
50+
to_choice_object,
5051
)
52+
from hct_mis_api.apps.geo.models import Area
5153
from hct_mis_api.apps.geo.schema import AreaNode
5254
from hct_mis_api.apps.grievance.models import GrievanceTicket
5355
from hct_mis_api.apps.household.filters import (
@@ -345,9 +347,9 @@ def resolve_phone_no_alternative_valid(parent, info: Any) -> Boolean:
345347
def resolve_delivery_mechanisms_data(parent, info: Any) -> QuerySet[DeliveryMechanismData]:
346348
program_id = get_program_id_from_headers(info.context.headers)
347349
if not info.context.user.has_permission(
348-
Permissions.POPULATION_VIEW_INDIVIDUAL_DELIVERY_MECHANISMS_SECTION.value,
349-
parent.business_area,
350-
program_id,
350+
Permissions.POPULATION_VIEW_INDIVIDUAL_DELIVERY_MECHANISMS_SECTION.value,
351+
parent.business_area,
352+
program_id,
351353
):
352354
return parent.delivery_mechanisms_data.none()
353355

@@ -378,9 +380,9 @@ def check_node_permission(cls, info: Any, object_instance: Individual) -> None:
378380

379381
# if user can't simply view all individuals, we check if they can do it because of grievance or rdi details
380382
if not user.has_permission(
381-
Permissions.POPULATION_VIEW_INDIVIDUALS_DETAILS.value,
382-
object_instance.business_area,
383-
object_instance.program_id,
383+
Permissions.POPULATION_VIEW_INDIVIDUALS_DETAILS.value,
384+
object_instance.business_area,
385+
object_instance.program_id,
384386
) and not user.has_permission(
385387
Permissions.RDI_VIEW_DETAILS.value,
386388
object_instance.business_area,
@@ -469,8 +471,8 @@ def resolve_sanction_list_confirmed_match(parent: Household, info: Any) -> bool:
469471
return parent.sanction_list_confirmed_match
470472

471473
@staticmethod
472-
def resolve_admin_area(self, info: Any) -> AreaNode:
473-
return get_lowest_admin_area(self)
474+
def resolve_admin_area(parent: Household, info: Any) -> Optional[Area]:
475+
return get_lowest_admin_area(parent)
474476

475477
@staticmethod
476478
def resolve_admin_area_title(parent: Household, info: Any) -> str:
@@ -555,9 +557,9 @@ def check_node_permission(cls, info: Any, object_instance: Household) -> None:
555557

556558
# if user doesn't have permission to view all households or RDI details, we check based on their grievance tickets
557559
if not user.has_permission(
558-
Permissions.POPULATION_VIEW_HOUSEHOLDS_DETAILS.value,
559-
object_instance.business_area,
560-
object_instance.program_id,
560+
Permissions.POPULATION_VIEW_HOUSEHOLDS_DETAILS.value,
561+
object_instance.business_area,
562+
object_instance.program_id,
561563
) and not user.has_permission(
562564
Permissions.RDI_VIEW_DETAILS.value,
563565
object_instance.business_area,
@@ -816,16 +818,19 @@ def resolve_all_households(self, info: Any, **kwargs: Any) -> QuerySet:
816818

817819
queryset = queryset.filter(filter_q)
818820

819-
if does_path_exist_in_query("edges.node.admin1", info) or does_path_exist_in_query("edges.node.admin_area",
820-
info):
821+
if does_path_exist_in_query("edges.node.admin1", info) or does_path_exist_in_query(
822+
"edges.node.admin_area", info
823+
):
821824
queryset = queryset.select_related("admin1")
822825
queryset = queryset.select_related("admin1__area_type")
823-
if does_path_exist_in_query("edges.node.admin2", info) or does_path_exist_in_query("edges.node.admin_area",
824-
info):
826+
if does_path_exist_in_query("edges.node.admin2", info) or does_path_exist_in_query(
827+
"edges.node.admin_area", info
828+
):
825829
queryset = queryset.select_related("admin2")
826830
queryset = queryset.select_related("admin2__area_type")
827-
if does_path_exist_in_query("edges.node.admin3", info) or does_path_exist_in_query("edges.node.admin_area",
828-
info):
831+
if does_path_exist_in_query("edges.node.admin3", info) or does_path_exist_in_query(
832+
"edges.node.admin_area", info
833+
):
829834
queryset = queryset.select_related("admin3")
830835
queryset = queryset.select_related("admin3__area_type")
831836

@@ -899,7 +904,7 @@ def resolve_deduplication_status_choices(self, info: Any, **kwargs: Any) -> List
899904
@chart_permission_decorator(permissions=[Permissions.DASHBOARD_VIEW_COUNTRY])
900905
@cached_in_django_cache(24)
901906
def resolve_section_households_reached(
902-
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
907+
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
903908
) -> Dict[str, int]:
904909
payment_items_qs: "QuerySet" = get_payment_items_for_dashboard(
905910
year, business_area_slug, chart_filters_decoder(kwargs), True
@@ -909,7 +914,7 @@ def resolve_section_households_reached(
909914
@chart_permission_decorator(permissions=[Permissions.DASHBOARD_VIEW_COUNTRY])
910915
@cached_in_django_cache(24)
911916
def resolve_section_individuals_reached(
912-
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
917+
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
913918
) -> Dict[str, int]:
914919
payment_items_qs: "QuerySet" = get_payment_items_for_dashboard(
915920
year, business_area_slug, chart_filters_decoder(kwargs), True
@@ -920,7 +925,7 @@ def resolve_section_individuals_reached(
920925
@chart_permission_decorator(permissions=[Permissions.DASHBOARD_VIEW_COUNTRY])
921926
@cached_in_django_cache(24)
922927
def resolve_section_people_reached(
923-
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
928+
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
924929
) -> Dict[str, int]:
925930
payment_items_qs: "QuerySet" = get_payment_items_for_dashboard(
926931
year, business_area_slug, chart_filters_decoder(kwargs), True
@@ -931,7 +936,7 @@ def resolve_section_people_reached(
931936
@chart_permission_decorator(permissions=[Permissions.DASHBOARD_VIEW_COUNTRY])
932937
@cached_in_django_cache(24)
933938
def resolve_section_child_reached(
934-
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
939+
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
935940
) -> Dict[str, int]:
936941
households_child_params = [
937942
"female_age_group_0_5_count",
@@ -951,7 +956,7 @@ def resolve_section_child_reached(
951956
@chart_permission_decorator(permissions=[Permissions.DASHBOARD_VIEW_COUNTRY])
952957
@cached_in_django_cache(24)
953958
def resolve_chart_individuals_reached_by_age_and_gender(
954-
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
959+
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
955960
) -> Dict:
956961
households_params = [
957962
"female_age_group_0_5_count",
@@ -979,7 +984,7 @@ def resolve_chart_individuals_reached_by_age_and_gender(
979984
@chart_permission_decorator(permissions=[Permissions.DASHBOARD_VIEW_COUNTRY])
980985
@cached_in_django_cache(24)
981986
def resolve_chart_people_reached_by_age_and_gender(
982-
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
987+
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
983988
) -> Dict:
984989
households_params = [
985990
"female_age_group_0_5_count",
@@ -1007,7 +1012,7 @@ def resolve_chart_people_reached_by_age_and_gender(
10071012
@chart_permission_decorator(permissions=[Permissions.DASHBOARD_VIEW_COUNTRY])
10081013
@cached_in_django_cache(24)
10091014
def resolve_chart_individuals_with_disability_reached_by_age(
1010-
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
1015+
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
10111016
) -> Dict:
10121017
households_params_with_disability = [
10131018
"female_age_group_0_5_disabled_count",
@@ -1069,7 +1074,7 @@ def resolve_chart_individuals_with_disability_reached_by_age(
10691074
@chart_permission_decorator(permissions=[Permissions.DASHBOARD_VIEW_COUNTRY])
10701075
@cached_in_django_cache(24)
10711076
def resolve_chart_people_with_disability_reached_by_age(
1072-
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
1077+
self, info: Any, business_area_slug: str, year: int, **kwargs: Any
10731078
) -> Dict:
10741079
households_params_with_disability = [
10751080
"female_age_group_0_5_disabled_count",

src/hct_mis_api/apps/registration_datahub/tasks/rdi_kobo_create.py

-1
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,6 @@ def handle_household(
420420
household_obj.registration_data_import = self.registration_data_import
421421
household_obj.program = self.registration_data_import.program
422422
household_obj.business_area = self.business_area
423-
household_obj.set_admin_areas()
424423
households_to_create.append(household_obj)
425424
for ind in current_individuals:
426425
ind.first_registration_date = registration_date

tests/selenium/grievance/feedback/test_feedback.py

-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ def create_households_and_individuals() -> Household:
9292
hh.admin1 = Area.objects.first()
9393
hh.admin2 = Area.objects.get(name="Shakardara")
9494
hh.save()
95-
hh.set_admin_areas()
9695
hh.refresh_from_db()
9796
yield hh
9897

tests/unit/apps/household/test_models.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,10 @@ def setUpTestData(cls) -> None:
5656

5757
def test_household_admin_areas_set(self) -> None:
5858
household, (individual) = create_household(household_args={"size": 1, "business_area": self.business_area})
59-
household.admin_area = self.area1
6059
household.admin1 = self.area1
6160
household.save()
6261

63-
household.set_admin_areas()
62+
household.set_admin_areas(self.area1)
6463
household.refresh_from_db()
6564

6665
self.assertEqual(household.admin_area, self.area1)

tests/unit/apps/payment/test_finish_verification_plan.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,14 @@ def setUpTestData(cls) -> None:
6262
household, _ = create_household(
6363
{
6464
"registration_data_import": registration_data_import,
65-
"admin_area": afghanistan_areas_qs.order_by("?").first(),
65+
"admin1": afghanistan_areas_qs.order_by("?").first(),
6666
"program": cls.program,
6767
},
6868
{
6969
"registration_data_import": registration_data_import,
7070
"phone_no": f"+48 609 999 {i:03d}",
7171
},
7272
)
73-
household.set_admin_areas()
7473
household.program = cls.program
7574
household.refresh_from_db()
7675

0 commit comments

Comments
 (0)