Skip to content

Commit 6873e0a

Browse files
committed
Add choicefield for financial_institution
1 parent 32685da commit 6873e0a

File tree

3 files changed

+79
-22
lines changed

3 files changed

+79
-22
lines changed

src/country_workspace/contrib/hope/apps.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.apps import AppConfig
22

33
from .geo import Admin1Choice, Admin2Choice, Admin3Choice, Admin4Choice, CountryChoice
4+
from .lookups import FinancialInstitutionChoice
45

56

67
class Config(AppConfig):
@@ -19,6 +20,7 @@ def ready(self) -> None:
1920
field_registry.register(Admin2Choice)
2021
field_registry.register(Admin3Choice)
2122
field_registry.register(Admin4Choice)
23+
field_registry.register(FinancialInstitutionChoice)
2224

2325
from country_workspace.contrib.hope.validators import FullHouseholdValidator
2426
from country_workspace.validators.registry import beneficiary_validator_registry
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from typing import Any
2+
3+
from django import forms
4+
5+
from country_workspace.contrib.hope.geo import APIChoicesMixin
6+
7+
8+
class FinancialInstitutionChoice(APIChoicesMixin, forms.ChoiceField):
9+
path: str = "lookups/financial-institution"
10+
11+
def __init__(self, choices: list[tuple[str, str]] | None = None, **kwargs: Any) -> None:
12+
super().__init__(choices=choices or [], **kwargs)
13+
self.choices = self.get_choices()
14+
15+
def get_choices(self) -> list[tuple[str, str]]:
16+
data = self.fetch_api()
17+
return [
18+
(
19+
rec["id"],
20+
rec["name"],
21+
)
22+
for rec in data
23+
]

src/country_workspace/versioning/scripts/0009_add_document_and_account_fieldsets.py

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# Generated by HCW 0.1.0 on 2025 06 23 11:12:31
2+
from concurrency.utils import fqn
23
from django.db import transaction
34
from hope_flex_fields.models import Fieldset, DataChecker, DataCheckerFieldset, FieldDefinition
5+
from hope_flex_fields.registry import field_registry
6+
from hope_flex_fields.utils import get_kwargs_from_field_class, get_common_attrs
47
from packaging.version import Version
58

69
from django import forms
@@ -10,6 +13,7 @@
1013
DOCUMENT_FIELDSET_NAME,
1114
ACCOUNT_FIELDSET_NAME,
1215
)
16+
from country_workspace.contrib.hope.lookups import FinancialInstitutionChoice
1317
from country_workspace.utils.flex_fields import Base64ImageField
1418

1519
_script_for_version = Version("0.1.0")
@@ -34,57 +38,85 @@
3438
("number", {"field_type": forms.CharField}, {}),
3539
("data", {"field_type": forms.JSONField}, {}),
3640
("unique_key", {"field_type": forms.CharField}, {}),
41+
("financial_institution", {"name": "FinancialInstitutionChoice"}, {}),
3742
]
3843

3944

40-
def remove_fields_from_individual_fieldset() -> None:
45+
def remove_document_and_account_fields_from_individual_fieldset() -> None:
4146
fieldset = Fieldset.objects.get(name=INDIVIDUAL_CHECKER_NAME)
4247
for field_name, _, _ in fields_to_remove:
4348
fieldset.fields.get(name=field_name).delete()
4449

4550

46-
def create_and_add_fieldsets_to_datachecker() -> tuple[Fieldset, Fieldset]:
51+
def add_document_and_account_fields_to_individual_fieldset() -> None:
52+
individual_fieldset, _ = Fieldset.objects.get_or_create(name=INDIVIDUAL_CHECKER_NAME)
53+
for field_name, field_def, field_attrs in fields_to_remove:
54+
individual_fieldset.fields.get_or_create(
55+
name=field_name,
56+
definition=FieldDefinition.objects.get(**field_def),
57+
defaults={"attrs": field_attrs or {}},
58+
)
59+
60+
61+
def add_financial_institution_field_definitions() -> None:
62+
field_registry.register(FinancialInstitutionChoice)
63+
FieldDefinition.objects.get_or_create(
64+
name=FinancialInstitutionChoice.__name__,
65+
field_type=fqn(FinancialInstitutionChoice),
66+
defaults={"attrs": get_kwargs_from_field_class(FinancialInstitutionChoice, get_common_attrs())},
67+
)
68+
69+
70+
def remove_financial_institution_field_definitions() -> None:
71+
FieldDefinition.objects.filter(
72+
name=FinancialInstitutionChoice.__name__,
73+
field_type=fqn(FinancialInstitutionChoice),
74+
).delete()
75+
76+
77+
def add_fields_to_fieldsets(fieldset: Fieldset, fields: list) -> None:
78+
for field_name, field_def, field_attrs in fields:
79+
fieldset.fields.get_or_create(
80+
name=field_name, definition=FieldDefinition.objects.get(**field_def), defaults={"attrs": field_attrs or {}}
81+
)
82+
83+
84+
def add_account_and_document_fieldsets() -> None:
4785
ind_datachecker = DataChecker.objects.get(name=INDIVIDUAL_CHECKER_NAME)
4886

4987
document_fieldset, _ = Fieldset.objects.get_or_create(name=DOCUMENT_FIELDSET_NAME)
5088
account_fieldset, _ = Fieldset.objects.get_or_create(name=ACCOUNT_FIELDSET_NAME)
5189
for fieldset, prefixes in (
5290
(document_fieldset, ("national_id__", "national_passport__")),
53-
(account_fieldset, ("photo__", "bank__")),
91+
(account_fieldset, ("phone__", "bank__")),
5492
):
5593
for prefix in prefixes:
5694
DataCheckerFieldset.objects.get_or_create(checker=ind_datachecker, fieldset=fieldset, prefix=prefix)
57-
return document_fieldset, account_fieldset
5895

96+
for fieldset, fields in ((document_fieldset, document_fields), (account_fieldset, account_fields)):
97+
add_fields_to_fieldsets(fieldset, fields)
5998

60-
def add_fields_to_fieldsets(fieldset: Fieldset, fields: list) -> None:
61-
for field_name, field_def, field_attrs in fields:
62-
fieldset.fields.get_or_create(
63-
name=field_name, definition=FieldDefinition.objects.get(**field_def), defaults={"attrs": field_attrs or {}}
64-
)
99+
100+
def remove_account_and_document_fieldsets() -> None:
101+
Fieldset.objects.filter(name__in=[DOCUMENT_FIELDSET_NAME, ACCOUNT_FIELDSET_NAME]).delete()
65102

66103

67104
def forward() -> None:
68105
with transaction.atomic():
69-
remove_fields_from_individual_fieldset()
106+
remove_document_and_account_fields_from_individual_fieldset()
70107

71-
document_fieldset, account_fieldset = create_and_add_fieldsets_to_datachecker()
108+
add_financial_institution_field_definitions()
72109

73-
for fieldset, fields in ((document_fieldset, document_fields), (account_fieldset, account_fields)):
74-
add_fields_to_fieldsets(fieldset, fields)
110+
add_account_and_document_fieldsets()
75111

76112

77113
def backward() -> None:
78114
with transaction.atomic():
79-
Fieldset.objects.filter(name__in=[DOCUMENT_FIELDSET_NAME, ACCOUNT_FIELDSET_NAME]).delete()
80-
81-
individual_fieldset, _ = Fieldset.objects.get_or_create(name=INDIVIDUAL_CHECKER_NAME)
82-
for field_name, field_def, field_attrs in fields_to_remove:
83-
individual_fieldset.fields.get_or_create(
84-
name=field_name,
85-
definition=FieldDefinition.objects.get(**field_def),
86-
defaults={"attrs": field_attrs or {}},
87-
)
115+
remove_account_and_document_fieldsets()
116+
117+
remove_financial_institution_field_definitions()
118+
119+
add_document_and_account_fields_to_individual_fieldset()
88120

89121

90122
class Scripts:

0 commit comments

Comments
 (0)