From c9553c54dc7451317c4f9718df009cd2ca17ffdb Mon Sep 17 00:00:00 2001 From: Oliwia Zaremba Date: Wed, 23 Aug 2023 18:52:09 +0200 Subject: [PATCH] Display initial values for bulk import and services --- apps/accounts/forms.py | 22 +++++++++++++++++++--- apps/accounts/models/provider_request.py | 8 -------- apps/accounts/views.py | 15 +++++++++++---- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/apps/accounts/forms.py b/apps/accounts/forms.py index c78816bb..2f587cc7 100644 --- a/apps/accounts/forms.py +++ b/apps/accounts/forms.py @@ -251,7 +251,7 @@ class Meta: fields = ["name", "website", "description", "authorised_by_org"] -class ServicesForm(forms.Form): +class ServicesForm(forms.ModelForm): """ Part of multi-step registration form (screen 2) """ @@ -265,6 +265,21 @@ class ServicesForm(forms.Form): ), ) + def __init__(self, *args, **kwargs): + """ + Implement injecting initial values for services field (for editing existing objects). + By default the initial value is passed as a queryset, + but TaggableManager does not handle that well - we pass a list instead. + """ + super().__init__(*args, **kwargs) + instance = kwargs.get("instance") + if instance: + self.initial = {"services": [s for s in instance.services.slugs()]} + + class Meta: + model = ac_models.ProviderRequest + fields = ["services"] + class CredentialForm(forms.ModelForm): class Meta: @@ -587,7 +602,7 @@ class Meta: ) -class LocationExtraForm(forms.Form): +class LocationExtraForm(forms.ModelForm): """ A form for information relating to the location step, not a to a single one of the locations listed on the location step. @@ -605,7 +620,8 @@ class LocationExtraForm(forms.Form): ) class Meta: - exclude = ["request"] + model = ac_models.ProviderRequest + fields = ["location_import_required"] class LocationStepForm(BetterMultiModelForm): diff --git a/apps/accounts/models/provider_request.py b/apps/accounts/models/provider_request.py index cfddd309..9642411f 100644 --- a/apps/accounts/models/provider_request.py +++ b/apps/accounts/models/provider_request.py @@ -127,14 +127,6 @@ def from_kwargs(**kwargs) -> "ProviderRequest": pr_data.setdefault("status", ProviderRequestStatus.OPEN.value) return ProviderRequest.objects.create(**pr_data) - def set_services_from_slugs(self, service_slugs: Iterable[str]) -> None: - """ - Given list of service slugs (corresponding to Tag slugs) - apply matching services to the ProviderRequest object - """ - services = Service.objects.filter(slug__in=service_slugs) - self.services.set(services) - @classmethod def get_service_choices(cls) -> List[Tuple[int, str]]: """ diff --git a/apps/accounts/views.py b/apps/accounts/views.py index 0e04ef26..fc08e904 100644 --- a/apps/accounts/views.py +++ b/apps/accounts/views.py @@ -310,7 +310,8 @@ def done(self, form_list, form_dict, **kwargs): # process SERVICES form: assign services to ProviderRequest services_form = form_dict[steps.SERVICES.value] - pr.set_services_from_slugs(services_form.cleaned_data["services"]) + services = services_form.cleaned_data["services"] + pr.services.set(*services) pr.created_by = self.request.user pr.save() @@ -341,9 +342,12 @@ def done(self, form_list, form_dict, **kwargs): network_explanation = extra_network_form.cleaned_data.get( "missing_network_explanation" ) - if network_explanation: - pr.missing_network_explanation = network_explanation - pr.save() + network_import_required = extra_network_form.cleaned_data.get( + "network_import_required" + ) + pr.missing_network_explanation = bool(network_explanation) + pr.network_import_required = bool(network_import_required) + pr.save() # process CONSENT form consent_form = form_dict[steps.CONSENT.value] @@ -444,7 +448,9 @@ def get_instance_dict(self, request_id): self.Steps.ORG_DETAILS.value: pr_instance, self.Steps.LOCATIONS.value: { "locations": location_qs, + "extra": pr_instance, }, + self.Steps.SERVICES.value: pr_instance, self.Steps.GREEN_EVIDENCE.value: evidence_qs, self.Steps.NETWORK_FOOTPRINT.value: { "ips": ip_qs, @@ -456,6 +462,7 @@ def get_instance_dict(self, request_id): return instance_dict def get_form_instance(self, step): + # TODO: optimize this - do not construct instance_dict on every call request_id = self.kwargs.get("request_id") if not request_id: return None