From dda0d65b9c5f5d52dbbf5400b1bc6839f8de221a Mon Sep 17 00:00:00 2001 From: sks444 <krishnasingh.ss30@gmail.com> Date: Mon, 14 Jun 2021 09:16:10 +0530 Subject: [PATCH] Fix file upload and last step --- hypha/apply/projects/forms/vendor.py | 35 +++++------ .../projects/migrations/0037_add_vendor.py | 22 +++++++ hypha/apply/projects/models/vendor.py | 12 ++-- .../application_projects/vendor_form.html | 7 +-- .../application_projects/vendor_success.html | 3 +- hypha/apply/projects/urls.py | 2 - hypha/apply/projects/views/__init__.py | 2 - hypha/apply/projects/views/vendor.py | 62 ++++++++++++------- .../src/javascript/apply/file-uploads.js | 18 ++++++ 9 files changed, 105 insertions(+), 58 deletions(-) create mode 100644 hypha/apply/projects/migrations/0037_add_vendor.py diff --git a/hypha/apply/projects/forms/vendor.py b/hypha/apply/projects/forms/vendor.py index 23fbf74ec..86319a0dc 100644 --- a/hypha/apply/projects/forms/vendor.py +++ b/hypha/apply/projects/forms/vendor.py @@ -1,9 +1,11 @@ +from addressfield.fields import AddressField from django import forms -from django.db import models from babel.numbers import list_currencies, get_currency_name +from hypha.apply.stream_forms.fields import MultiFileField +from django_file_form.forms import FileFormMixin -from addressfield.fields import AddressField +# from addressfield.fields import AddressField from ..models.vendor import Vendor, VendorFormSettings @@ -44,25 +46,21 @@ class CreateVendorFormStep1(BaseVendorForm, forms.ModelForm): self.fields['type'].choices = self.fields['type'].choices[1:] -class CreateVendorFormStep2(BaseVendorForm, forms.ModelForm): - required_to_pay_taxes = forms.ChoiceField( +class CreateVendorFormStep2(BaseVendorForm, forms.Form): + required_to_pay_taxes = forms.TypedChoiceField( choices=((False, 'No'), (True, 'Yes')), - widget=forms.RadioSelect + coerce=lambda x: x == 'True', + widget=forms.RadioSelect, + required=True ) - class Meta: - fields = [ - 'required_to_pay_taxes', - ] - model = Vendor - def __init__(self, *args, **kwargs): super(CreateVendorFormStep2, self).__init__(*args, **kwargs) self.fields = self.apply_form_settings(self.fields) -class CreateVendorFormStep3(BaseVendorForm, forms.Form): - due_diligence_documents = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True})) +class CreateVendorFormStep3(FileFormMixin, BaseVendorForm, forms.Form): + due_diligence_documents = MultiFileField(required=False) def __init__(self, *args, **kwargs): super(CreateVendorFormStep3, self).__init__(*args, **kwargs) @@ -90,9 +88,11 @@ class CreateVendorFormStep4(BaseVendorForm, forms.Form): class CreateVendorFormStep5(BaseVendorForm, forms.Form): - need_extra_info = forms.ChoiceField( + need_extra_info = forms.TypedChoiceField( choices=((False, 'No'), (True, 'Yes')), - widget=forms.RadioSelect + coerce=lambda x: x == 'True', + widget=forms.RadioSelect, + required=True ) def __init__(self, *args, **kwargs): @@ -105,8 +105,7 @@ class CreateVendorFormStep6(BaseVendorForm, forms.Form): (currency, f'{get_currency_name(currency)} - {currency}') for currency in list_currencies() ] - - branch_address = AddressField(required=False) + branch_address = AddressField() ib_account_routing_number = forms.CharField(required=False) ib_account_number = forms.CharField(required=False) ib_account_currency = forms.ChoiceField( @@ -114,7 +113,7 @@ class CreateVendorFormStep6(BaseVendorForm, forms.Form): required=False, initial='USD' ) - ib_branch_address = AddressField(required=False) + # ib_branch_address = AddressField() nid_type = forms.CharField(required=False) nid_number = forms.CharField(required=False) other_info = forms.CharField(required=False) diff --git a/hypha/apply/projects/migrations/0037_add_vendor.py b/hypha/apply/projects/migrations/0037_add_vendor.py new file mode 100644 index 000000000..02162eedc --- /dev/null +++ b/hypha/apply/projects/migrations/0037_add_vendor.py @@ -0,0 +1,22 @@ +# Generated by Django 2.2.23 on 2021-06-10 10:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('application_projects', '0036_add_vendor'), + ] + + operations = [ + migrations.RemoveField( + model_name='vendorformsettings', + name='account_currency', + ), + migrations.AddField( + model_name='vendorformsettings', + name='account_currency_label', + field=models.TextField(default='Bank Account Currency', verbose_name='label'), + ), + ] diff --git a/hypha/apply/projects/models/vendor.py b/hypha/apply/projects/models/vendor.py index e93f80360..1d2e3375c 100644 --- a/hypha/apply/projects/models/vendor.py +++ b/hypha/apply/projects/models/vendor.py @@ -84,7 +84,7 @@ class DueDiligenceDocument(models.Model): ) def __str__(self): - return self.vendor.full_name + ' -> ' + self.document.name + return self.vendor.name + ' -> ' + self.document.name @register_setting @@ -154,7 +154,7 @@ class VendorFormSettings(BaseSetting): 'help_text', default='Depending on your country, this might be called the account number, IBAN, or BBAN number.' ) - account_currency = models.TextField( + account_currency_label = models.TextField( 'label', default='Bank Account Currency' ) @@ -239,12 +239,12 @@ class VendorFormSettings(BaseSetting): panels = [ MultiFieldPanel([ - FieldPanel('full_name_label'), - FieldPanel('full_name_help_text'), + FieldPanel('name_label'), + FieldPanel('name_help_text'), ], 'Name'), MultiFieldPanel([ - FieldPanel('full_name_label'), - FieldPanel('full_name_help_text'), + FieldPanel('contractor_name_label'), + FieldPanel('contractor_name_help_text'), ], 'Contractor Name'), MultiFieldPanel([ FieldPanel('type_label'), diff --git a/hypha/apply/projects/templates/application_projects/vendor_form.html b/hypha/apply/projects/templates/application_projects/vendor_form.html index 42913439f..fc44c29f1 100644 --- a/hypha/apply/projects/templates/application_projects/vendor_form.html +++ b/hypha/apply/projects/templates/application_projects/vendor_form.html @@ -1,11 +1,11 @@ {% extends "base-apply.html" %} {% load static %} -{% block title %}{% if object %}Edit{% else %}Create{% endif %} Payment Request: {% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}{% endblock %} +{% block title %}{% if object %}Edit{% else %}Setup{% endif %} Contractor{% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}{% endblock %} {% block content %} <div class="admin-bar"> <div class="admin-bar__inner"> - <h2 class="heading heading--no-margin">{% if object %}Editing{% else %}Create{% endif %} Payment Request</h2> + <h2 class="heading heading--no-margin">{% if object %}Editing{% else %}Setup{% endif %} Contractor Information</h2> <h5 class="heading heading--no-margin">{% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}</h5> </div> </div> @@ -18,7 +18,6 @@ {{ wizard.management_form }} {% csrf_token %} {{ form.media }} - {% for field in form %} {% if field.field %} {% include "forms/includes/field.html" %} @@ -26,7 +25,7 @@ {{ field }} {% endif %} {% endfor %} - <button class="button button--submit button--top-space button--primary" type="submit" name="save">Save</button> + <button class="button button--submit button--top-space button--primary" type="submit" name="save">{% if wizard.steps.step1 == 6 %}Submit{% else %}Save and continue{% endif %}</button> </form> </div> </div> diff --git a/hypha/apply/projects/templates/application_projects/vendor_success.html b/hypha/apply/projects/templates/application_projects/vendor_success.html index b080f97e8..eaa9d124a 100644 --- a/hypha/apply/projects/templates/application_projects/vendor_success.html +++ b/hypha/apply/projects/templates/application_projects/vendor_success.html @@ -1,12 +1,11 @@ {% extends "base-apply.html" %} {% load static %} -{% block title %}{% if object %}Edit{% else %}Create{% endif %} Payment Request: {% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}{% endblock %} +{% block title %}Contractor Setup Completed{% endblock %} {% block content %} <div class="admin-bar"> <div class="admin-bar__inner"> <h2 class="heading heading--no-margin">Contractor Setup Completed</h2> - <!-- <h5 class="heading heading--no-margin">{% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}</h5> --> </div> </div> <div class="wrapper wrapper--small"> diff --git a/hypha/apply/projects/urls.py b/hypha/apply/projects/urls.py index e23499768..8d7775569 100644 --- a/hypha/apply/projects/urls.py +++ b/hypha/apply/projects/urls.py @@ -22,7 +22,6 @@ from .views import ( ReportSkipView, ReportUpdateView, CreateVendorView, - VendorFormSuccess, ) app_name = 'projects' @@ -39,7 +38,6 @@ urlpatterns = [ path('simplified/', ProjectDetailSimplifiedView.as_view(), name='simplified'), path('request/', CreatePaymentRequestView.as_view(), name='request'), path('vendor/', CreateVendorView.as_view(), name='vendor'), - path('vendor/success/', VendorFormSuccess.as_view(), name='vendor-success'), ])), path('payment-requests/', include(([ path('', PaymentRequestListView.as_view(), name='all'), diff --git a/hypha/apply/projects/views/__init__.py b/hypha/apply/projects/views/__init__.py index 1d920db3d..fecd26b3b 100644 --- a/hypha/apply/projects/views/__init__.py +++ b/hypha/apply/projects/views/__init__.py @@ -43,7 +43,6 @@ from .report import ( ) from .vendor import ( CreateVendorView, - VendorFormSuccess, ) __all__ = [ @@ -85,5 +84,4 @@ __all__ = [ 'ReportFrequencyUpdate', 'ReportListView', 'CreateVendorView', - 'VendorFormSuccess', ] diff --git a/hypha/apply/projects/views/vendor.py b/hypha/apply/projects/views/vendor.py index 8ed4ecacb..91a396c73 100644 --- a/hypha/apply/projects/views/vendor.py +++ b/hypha/apply/projects/views/vendor.py @@ -1,8 +1,4 @@ -from hypha.apply.projects.models.vendor import BankInformation -from django.views.generic import CreateView, TemplateView -from django.shortcuts import redirect -from django.urls import reverse -from django.shortcuts import get_object_or_404 +from django.shortcuts import get_object_or_404, render from wagtail.core.models import Site from formtools.wizard.views import SessionWizardView @@ -19,51 +15,69 @@ from ..forms import ( ) +def show_extra_info_form(wizard): + # try to get the cleaned data of step where we ask if extra info is needed + cleaned_data = wizard.get_cleaned_data_for_step('extra') or {} + # check if the field ``extra_info`` box was checked. + return cleaned_data.get('need_extra_info', True) + + class CreateVendorView(SessionWizardView): model = Vendor file_storage = PrivateStorage() form_list = [ - CreateVendorFormStep1, - CreateVendorFormStep2, - CreateVendorFormStep3, - CreateVendorFormStep4, - CreateVendorFormStep5, - CreateVendorFormStep6, + ('basic', CreateVendorFormStep1), + ('taxes', CreateVendorFormStep2), + ('documents', CreateVendorFormStep3), + ('bank', CreateVendorFormStep4), + ('extra', CreateVendorFormStep5), + ('other', CreateVendorFormStep6), ] + condition_dict = {'other': show_extra_info_form} template_name = 'application_projects/vendor_form.html' def done(self, form_list, **kwargs): project = get_object_or_404(Project, pk=self.kwargs['pk']) cleaned_data = self.get_all_cleaned_data() vendor = project.vendor - intermediary_bank_information = BankInformation.objects.create( - account_routing_number=cleaned_data['ib_account_routing_number'], - account_number=cleaned_data['ib_account_number'], - account_currency=cleaned_data['ib_account_currency'], - branch_address=cleaned_data['ib_branch_address'] + vendor, _ = Vendor.objects.get_or_create( + user=project.user ) + need_extra_info = cleaned_data['need_extra_info'] bank_information = BankInformation.objects.create( account_holder_name=cleaned_data['account_holder_name'], account_routing_number=cleaned_data['account_routing_number'], account_number=cleaned_data['account_number'], account_currency=cleaned_data['account_currency'], - need_extra_info=cleaned_data['need_extra_info'], - branch_address=cleaned_data['branch_address'], - iba_info=intermediary_bank_information + need_extra_info=need_extra_info, ) + if need_extra_info: + intermediary_bank_information = BankInformation.objects.create( + account_routing_number=cleaned_data['ib_account_routing_number'], + account_number=cleaned_data['ib_account_number'], + account_currency=cleaned_data['ib_account_currency'], + # branch_address=cleaned_data['ib_branch_address'] + ) + bank_information.branch_address = cleaned_data['branch_address'] + bank_information.iba_info = intermediary_bank_information + bank_information.save() + vendor.bank_info = bank_information vendor.full_name = cleaned_data['name'] vendor.contractor_name = cleaned_data['contractor_name'] vendor.type = cleaned_data['type'] vendor.required_to_pay_taxes = cleaned_data['required_to_pay_taxes'] vendor.save() - return redirect(reverse('/vendor/success/', args=[project.id])) + for f in cleaned_data["due_diligence_documents"]: + try: + DueDiligenceDocument.objects.create(vendor=vendor, document=f) + finally: + f.close() + form = self.get_form(step='documents') + form.delete_temporary_files() + return render(self.request, 'application_projects/vendor_success.html') def get_form_kwargs(self, step): kwargs = super(CreateVendorView, self).get_form_kwargs(step) kwargs['site'] = Site.find_for_request(self.request) return kwargs - - -class VendorFormSuccess(TemplateView): - template_name = "application_projects/vendor_success.html" diff --git a/hypha/static_src/src/javascript/apply/file-uploads.js b/hypha/static_src/src/javascript/apply/file-uploads.js index 0f2257198..5e3826a16 100644 --- a/hypha/static_src/src/javascript/apply/file-uploads.js +++ b/hypha/static_src/src/javascript/apply/file-uploads.js @@ -9,6 +9,10 @@ jQuery(function ($) { init(form); form.initUploadFieldsDone = true; } + if (!form.initUploadFieldsDone && form.querySelector('[name=create_vendor_view-current_step]')) { + initWizard(form); + form.initUploadFieldsDone = true; + } }); function init(form) { @@ -18,4 +22,18 @@ jQuery(function ($) { $('input[type=hidden]').closest('.form__group').hide(); } + // Initilise multi-step wizard forms + function initWizard(form) { + const step = form.querySelector('[name=create_vendor_view-current_step]').value + if (step === "documents"){ + window.initUploadFields( + form, + { + prefix: 'documents' + } + ); + // Hide wrapper elements for hidden inputs added by django-file-form + $('input[type=hidden]').closest('.form__group').hide(); + } + } }); -- GitLab