Skip to content

Index

hypha.apply.projects.views

ChangeInvoiceStatusView

Bases: DelegatedViewMixin, InvoiceAccessMixin, UpdateView

form_class class-attribute instance-attribute

context_name class-attribute instance-attribute

context_name = 'change_invoice_status'

model class-attribute instance-attribute

model = Invoice

get_object

get_object()
Source code in hypha/apply/utils/views.py
def get_object(self):
    # Make sure the form instance, bound at the parent class level,  is the same as the
    # value we work with on the class.
    # If we don't have self.object, bind the parent instance to it. This value will then
    # be used by the form. Any further calls to get_object will get a new instance of the object
    if not hasattr(self, "object"):
        parent_object = self.get_parent_object()
        if isinstance(parent_object, self.model):
            return parent_object

    return super().get_object()

test_func

test_func()
Source code in hypha/apply/projects/views/payment.py
def test_func(self):
    if self.request.user.is_apply_staff:
        return True

    if self.request.user.is_finance:
        return True

    if self.request.user == self.get_object().project.user:
        return True

    return False

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/utils/views.py
def get_form_kwargs(self):
    form_kwargs = super().get_form_kwargs()
    form_kwargs["user"] = self.request.user
    form_kwargs.update(**self.get_parent_kwargs())
    return form_kwargs

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_form

get_form(*args, **kwargs)
Source code in hypha/apply/utils/views.py
def get_form(self, *args, **kwargs):
    form = super().get_form(*args, **kwargs)
    form.name = self.get_form_name()
    return form

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_success_url

get_success_url()
Source code in hypha/apply/utils/views.py
def get_success_url(self):
    query = self.request.GET.urlencode()
    if query:
        query = "?" + query
    return self.request.path + query

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/payment.py
def form_valid(self, form):
    invoice = get_object_or_404(
        Invoice, pk=self.kwargs["invoice_pk"]
    )  # to get the old status
    old_status = invoice.status
    response = super().form_valid(form)
    if form.cleaned_data["comment"]:
        invoice_status_change = _(
            "<p>Invoice status updated to: {status}.</p>"
        ).format(status=self.object.get_status_display())
        comment = f"<p>{self.object.comment}.</p>"

        message = invoice_status_change + comment

        Activity.objects.create(
            user=self.request.user,
            type=COMMENT,
            source=self.object.project,
            timestamp=timezone.now(),
            message=message,
            visibility=APPLICANT,
            related_object=self.object,
        )

    if (
        self.request.user.is_apply_staff and self.object.status == APPROVED_BY_STAFF
    ) or (
        settings.INVOICE_EXTENDED_WORKFLOW
        and self.request.user.is_finance_level_1
        and self.object.status == APPROVED_BY_FINANCE
    ):
        messenger(
            MESSAGES.APPROVE_INVOICE,
            request=self.request,
            user=self.request.user,
            source=self.object.project,
            related=self.object,
        )

    messenger(
        MESSAGES.UPDATE_INVOICE_STATUS,
        request=self.request,
        user=self.request.user,
        source=self.object.project,
        related=self.object,
    )

    handle_tasks_on_invoice_update(old_status=old_status, invoice=self.object)

    return response

CreateInvoiceView

Bases: CreateView

model class-attribute instance-attribute

model = Invoice

form_class class-attribute instance-attribute

form_class = CreateInvoiceForm

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/payment.py
def dispatch(self, request, *args, **kwargs):
    self.project = Project.objects.get(pk=kwargs["pk"])
    if not request.user.is_apply_staff and not self.project.user == request.user:
        return redirect(self.project)
    return super().dispatch(request, *args, **kwargs)

buttons

buttons()
Source code in hypha/apply/projects/views/payment.py
def buttons(self):
    yield ("submit", "primary", _("Save"))

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/projects/views/payment.py
def get_context_data(self, **kwargs):
    return super().get_context_data(
        project=self.project, buttons=self.buttons(), **kwargs
    )

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/payment.py
def form_valid(self, form):
    form.instance.project = self.project
    form.instance.by = self.request.user

    response = super().form_valid(form)

    if form.cleaned_data["message_for_pm"]:
        invoice_status_change = _("<p>Invoice added.</p>")

        message_for_pm = f'<p>{form.cleaned_data["message_for_pm"]}</p>'

        message = invoice_status_change + message_for_pm

        Activity.objects.create(
            user=self.request.user,
            type=COMMENT,
            source=self.project,
            timestamp=timezone.now(),
            message=message,
            visibility=APPLICANT,
            related_object=self.object,
        )

    messenger(
        MESSAGES.CREATE_INVOICE,
        request=self.request,
        user=self.request.user,
        source=self.project,
        related=self.object,
    )

    if len(self.project.invoices.all()) == 1:
        # remove Project waiting invoices task for applicant on first invoice
        remove_tasks_for_user(
            code=PROJECT_WAITING_INVOICE,
            user=self.project.user,
            related_obj=self.project,
        )

    # add Invoice waiting approval task for Staff group
    add_task_to_user_group(
        code=INVOICE_WAITING_APPROVAL,
        user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
        related_obj=self.object,
    )

    messages.success(
        self.request, _("Invoice added"), extra_tags=PROJECT_ACTION_MESSAGE_TAG
    )

    # Required for django-file-form: delete temporary files for the new files
    # that are uploaded.
    form.delete_temporary_files()
    return response

DeleteInvoiceView

Bases: DeleteView

model class-attribute instance-attribute

model = Invoice

get_object

get_object()
Source code in hypha/apply/projects/views/payment.py
def get_object(self):
    project = get_object_or_404(Project, pk=self.kwargs["pk"])
    return get_object_or_404(project.invoices.all(), pk=self.kwargs["invoice_pk"])

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/payment.py
def dispatch(self, request, *args, **kwargs):
    self.object = self.get_object()
    if not self.object.can_user_delete(request.user):
        raise PermissionDenied

    return super().dispatch(request, *args, **kwargs)

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/payment.py
@transaction.atomic()
def form_valid(self, form):
    # remove all tasks related to this invoice irrespective of code and users/user_group
    remove_tasks_of_related_obj(related_obj=self.object)

    response = super().form_valid(form)

    messenger(
        MESSAGES.DELETE_INVOICE,
        request=self.request,
        user=self.request.user,
        source=self.object.project,
        related=self.object.project,
    )

    return response

get_success_url

get_success_url()
Source code in hypha/apply/projects/views/payment.py
def get_success_url(self):
    return self.object.project.get_absolute_url()

EditInvoiceView

Bases: InvoiceAccessMixin, UpdateView

model class-attribute instance-attribute

model = Invoice

form_class class-attribute instance-attribute

form_class = EditInvoiceForm

get_object

get_object()
Source code in hypha/apply/projects/views/payment.py
def get_object(self):
    project = get_object_or_404(Project, pk=self.kwargs["pk"])
    return get_object_or_404(project.invoices.all(), pk=self.kwargs["invoice_pk"])

test_func

test_func()
Source code in hypha/apply/projects/views/payment.py
def test_func(self):
    if self.request.user.is_apply_staff:
        return True

    if self.request.user.is_finance:
        return True

    if self.request.user == self.get_object().project.user:
        return True

    return False

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/payment.py
def dispatch(self, request, *args, **kwargs):
    invoice = self.get_object()
    if not invoice.can_user_edit(request.user):
        return redirect(invoice)
    return super().dispatch(request, *args, **kwargs)

buttons

buttons()
Source code in hypha/apply/projects/views/payment.py
def buttons(self):
    yield ("submit", "primary", _("Save"))
    if self.object.can_user_delete(self.request.user):
        yield ("delete", "warning", _("Delete"))

get_initial

get_initial()
Source code in hypha/apply/projects/views/payment.py
def get_initial(self):
    initial = super().get_initial()
    initial["supporting_documents"] = [
        document.document for document in self.object.supporting_documents.all()
    ]
    return initial

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/projects/views/payment.py
def get_context_data(self, **kwargs):
    return super().get_context_data(
        project=self.object.project, buttons=self.buttons(), **kwargs
    )

post

post(request, *args, **kwargs)
Source code in hypha/apply/projects/views/payment.py
def post(self, request, *args, **kwargs):
    self.object = self.get_object()
    form = self.get_form()
    if "delete" in form.data:
        return redirect(
            "apply:projects:invoice-delete",
            pk=self.object.project.id,
            invoice_pk=self.object.id,
        )
    if form.is_valid():
        return self.form_valid(form)
    else:
        return self.form_invalid(form)

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/payment.py
def form_valid(self, form):
    old_status = self.object.status
    response = super().form_valid(form)

    if form.cleaned_data:
        if self.object.status in INVOICE_TRANISTION_TO_RESUBMITTED:
            self.object.transition_invoice_to_resubmitted()
            self.object.save()

        if form.cleaned_data["message_for_pm"]:
            invoice_status_change = _(
                "<p>Invoice status updated to: {status}.</p>"
            ).format(status=self.object.get_status_display())
            message_for_pm = f'<p>{form.cleaned_data["message_for_pm"]}</p>'
            message = invoice_status_change + message_for_pm

            Activity.objects.create(
                user=self.request.user,
                type=COMMENT,
                source=self.object.project,
                timestamp=timezone.now(),
                message=message,
                visibility=APPLICANT,
                related_object=self.object,
            )

    messenger(
        MESSAGES.UPDATE_INVOICE_STATUS,
        request=self.request,
        user=self.request.user,
        source=self.object.project,
        related=self.object,
    )

    if self.request.user.is_applicant and old_status == CHANGES_REQUESTED_BY_STAFF:
        # remove invoice required changes task for applicant
        remove_tasks_for_user(
            code=INVOICE_REQUIRED_CHANGES,
            user=self.object.project.user,
            related_obj=self.object,
        )

        # add invoice waiting approval task for staff group
        add_task_to_user_group(
            code=INVOICE_WAITING_APPROVAL,
            user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
            related_obj=self.object,
        )

    if (
        self.request.user.is_apply_staff
        and old_status == CHANGES_REQUESTED_BY_FINANCE
    ):
        # remove invoice required changes task for staff group
        remove_tasks_for_user_group(
            code=INVOICE_REQUIRED_CHANGES,
            user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
            related_obj=self.object,
        )
        # add invoice waiting approval task for staff group
        add_task_to_user_group(
            code=INVOICE_WAITING_APPROVAL,
            user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
            related_obj=self.object,
        )

    # Required for django-file-form: delete temporary files for the new files
    # that are uploaded.
    form.delete_temporary_files()
    return response

InvoiceListView

InvoiceListView(*args, **kwargs)

Bases: SingleTableMixin, FilterView, DelegateableListView

Source code in hypha/apply/utils/views.py
def __init__(self, *args, **kwargs):
    self._form_views = {
        self.form_prefix + form_view.context_name: form_view
        for form_view in self.form_views
    }

form_prefix class-attribute instance-attribute

form_prefix = 'form-submitted-'

form_views class-attribute instance-attribute

filterset_class class-attribute instance-attribute

filterset_class = InvoiceListFilter

model class-attribute instance-attribute

model = Invoice

table_class class-attribute instance-attribute

table_class = AdminInvoiceListTable

template_name class-attribute instance-attribute

template_name = 'application_projects/invoice_list.html'

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/utils/views.py
def get_form_kwargs(self):
    return {
        "user": self.request.user,
    }

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    forms = {}
    for form_view in self._form_views.values():
        view = form_view()
        view.setup(self.request, self.args, self.kwargs)
        context_key, form = view.contribute_form(self)
        forms[context_key] = form

    return super().get_context_data(
        form_prefix=self.form_prefix,
        **forms,
        **kwargs,
    )

post

post(request, *args, **kwargs)
Source code in hypha/apply/utils/views.py
def post(self, request, *args, **kwargs):
    self.object_list = self.get_queryset()
    return super().post(request, *args, **kwargs)

InvoicePrivateMedia

Bases: UserPassesTestMixin, PrivateMediaView

storage class-attribute instance-attribute

storage = PrivateStorage()

raise_exception class-attribute instance-attribute

raise_exception = True

get

get(*args, **kwargs)
Source code in hypha/apply/utils/storage.py
def get(self, *args, **kwargs):
    file_to_serve = self.get_media(*args, **kwargs)
    return FileResponse(file_to_serve)

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/payment.py
def dispatch(self, *args, **kwargs):
    invoice_pk = self.kwargs["invoice_pk"]
    project_pk = self.kwargs["pk"]
    self.project = get_object_or_404(Project, pk=project_pk)
    self.invoice = get_object_or_404(self.project.invoices.all(), pk=invoice_pk)

    return super().dispatch(*args, **kwargs)

get_media

get_media(*args, **kwargs)
Source code in hypha/apply/projects/views/payment.py
def get_media(self, *args, **kwargs):
    file_pk = kwargs.get("file_pk")
    if not file_pk:
        return self.invoice.document

    document = get_object_or_404(self.invoice.supporting_documents, pk=file_pk)
    return document.document

test_func

test_func()
Source code in hypha/apply/projects/views/payment.py
def test_func(self):
    if self.request.user.is_apply_staff:
        return True

    if self.request.user.is_finance:
        return True

    if self.request.user == self.invoice.project.user:
        return True

    return False

InvoiceView

Bases: ViewDispatcher

reviewer_view class-attribute instance-attribute

reviewer_view = None

partner_view class-attribute instance-attribute

partner_view = None

community_view class-attribute instance-attribute

community_view = None

contracting_view class-attribute instance-attribute

contracting_view = None

admin_view class-attribute instance-attribute

admin_view = InvoiceAdminView

finance_view class-attribute instance-attribute

finance_view = InvoiceAdminView

applicant_view class-attribute instance-attribute

applicant_view = InvoiceApplicantView

admin_check

admin_check(request)
Source code in hypha/apply/utils/views.py
def admin_check(self, request):
    return request.user.is_apply_staff

reviewer_check

reviewer_check(request)
Source code in hypha/apply/utils/views.py
def reviewer_check(self, request):
    return request.user.is_reviewer

partner_check

partner_check(request)
Source code in hypha/apply/utils/views.py
def partner_check(self, request):
    return request.user.is_partner

community_check

community_check(request)
Source code in hypha/apply/utils/views.py
def community_check(self, request):
    return request.user.is_community_reviewer

finance_check

finance_check(request)
Source code in hypha/apply/utils/views.py
def finance_check(self, request):
    return request.user.is_finance

contracting_check

contracting_check(request)
Source code in hypha/apply/utils/views.py
def contracting_check(self, request):
    return request.user.is_contracting

applicant_check

applicant_check(request)
Source code in hypha/apply/utils/views.py
def applicant_check(self, request):
    return request.user.is_applicant

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/utils/views.py
def dispatch(self, request, *args, **kwargs):
    view = None

    if self.admin_check(request):
        view = self.admin_view
    elif self.reviewer_check(request):
        view = self.reviewer_view
    elif self.partner_check(request):
        view = self.partner_view
    elif self.community_check(request):
        view = self.community_view
    elif self.finance_check(request):
        view = self.finance_view
    elif self.contracting_check(request):
        view = self.contracting_view
    elif self.applicant_check(request):
        view = self.applicant_view

    if view:
        return view.as_view()(request, *args, **kwargs)
    return HttpResponseForbidden()

AdminProjectDetailView

AdminProjectDetailView(*args, **kwargs)

Bases: ActivityContextMixin, DelegateableView, ContractsMixin, BaseProjectDetailView

Source code in hypha/apply/utils/views.py
def __init__(self, *args, **kwargs):
    self._form_views = {
        self.form_prefix + form_view.context_name: form_view
        for form_view in self.form_views
    }

form_prefix class-attribute instance-attribute

form_prefix = 'form-submitted-'

model class-attribute instance-attribute

model = Project

template_name_suffix class-attribute instance-attribute

template_name_suffix = '_admin_detail'

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/utils/views.py
def get_form_kwargs(self):
    return {
        "user": self.request.user,
        "instance": self.object,
    }

post

post(request, *args, **kwargs)
Source code in hypha/apply/utils/views.py
def post(self, request, *args, **kwargs):
    self.object = self.get_object()

    kwargs["object"] = self.object

    return super().post(request, *args, **kwargs)

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, *args, **kwargs):
    project = self.get_object()
    permission, _ = has_permission(
        "project_access", self.request.user, object=project, raise_exception=True
    )
    return super().dispatch(*args, **kwargs)

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/projects/views/project.py
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["statuses"] = PROJECT_STATUS_CHOICES
    context["current_status_index"] = [
        status for status, _ in PROJECT_STATUS_CHOICES
    ].index(self.object.status)
    project_settings = ProjectSettings.for_request(self.request)
    context["project_settings"] = project_settings
    context["paf_approvals"] = PAFApprovals.objects.filter(project=self.object)
    context["all_document_categories"] = DocumentCategory.objects.all()
    context["remaining_document_categories"] = DocumentCategory.objects.filter(
        ~Q(packet_files__project=self.object)
    )
    context["all_contract_document_categories"] = (
        ContractDocumentCategory.objects.all()
    )
    context["remaining_contract_document_categories"] = (
        ContractDocumentCategory.objects.filter(
            ~Q(contract_packet_files__project=self.object)
        )
    )

    if (
        self.object.is_in_progress
        and not self.object.report_config.disable_reporting
    ):
        # Current due report can be none for ONE_TIME,
        # In case of ONE_TIME, either reporting is already completed(last_report exists)
        # or there should be a current_due_report.
        if self.object.report_config.current_due_report():
            context["report_data"] = {
                "startDate": self.object.report_config.current_due_report().start_date,
                "projectEndDate": self.object.end_date,
            }
        else:
            context["report_data"] = {
                "startDate": self.object.report_config.last_report().start_date,
                "projectEndDate": self.object.end_date,
            }
    return context

ApplicantProjectDetailView

ApplicantProjectDetailView(*args, **kwargs)

Bases: ActivityContextMixin, DelegateableView, ContractsMixin, BaseProjectDetailView

Source code in hypha/apply/utils/views.py
def __init__(self, *args, **kwargs):
    self._form_views = {
        self.form_prefix + form_view.context_name: form_view
        for form_view in self.form_views
    }

form_prefix class-attribute instance-attribute

form_prefix = 'form-submitted-'

model class-attribute instance-attribute

model = Project

template_name_suffix class-attribute instance-attribute

template_name_suffix = '_detail'

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/utils/views.py
def get_form_kwargs(self):
    return {
        "user": self.request.user,
        "instance": self.object,
    }

post

post(request, *args, **kwargs)
Source code in hypha/apply/utils/views.py
def post(self, request, *args, **kwargs):
    self.object = self.get_object()

    kwargs["object"] = self.object

    return super().post(request, *args, **kwargs)

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, request, *args, **kwargs):
    project = self.get_object()
    permission, _ = has_permission(
        "project_access", request.user, object=project, raise_exception=True
    )
    return super().dispatch(request, *args, **kwargs)

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/projects/views/project.py
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["statuses"] = PROJECT_PUBLIC_STATUSES
    context["current_status_index"] = [
        status for status, _ in PROJECT_PUBLIC_STATUSES
    ].index(self.object.status)
    context["all_contract_document_categories"] = (
        ContractDocumentCategory.objects.all()
    )
    context["remaining_contract_document_categories"] = (
        ContractDocumentCategory.objects.filter(
            ~Q(contract_packet_files__project=self.object)
        )
    )
    return context

ApproveContractView

Bases: DelegatedViewMixin, UpdateView

form_class class-attribute instance-attribute

form_class = ApproveContractForm

model class-attribute instance-attribute

model = Contract

context_name class-attribute instance-attribute

context_name = 'approve_contract_form'

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_form

get_form(*args, **kwargs)
Source code in hypha/apply/utils/views.py
def get_form(self, *args, **kwargs):
    form = super().get_form(*args, **kwargs)
    form.name = self.get_form_name()
    return form

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_object

get_object()
Source code in hypha/apply/projects/views/project.py
def get_object(self):
    project = self.get_parent_object()
    latest_contract = project.contracts.order_by("-created_at").first()
    if latest_contract and not latest_contract.approver:
        return latest_contract

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/projects/views/project.py
def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs["instance"] = self.get_object()
    kwargs.pop("user")
    return kwargs

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, request, *args, **kwargs):
    self.project = get_object_or_404(Project, pk=self.kwargs["pk"])
    return super().dispatch(request, *args, **kwargs)

form_invalid

form_invalid(form)
Source code in hypha/apply/projects/views/project.py
def form_invalid(self, form):
    messages.error(
        self.request,
        mark_safe(_("Sorry something went wrong") + form.errors.as_ul()),
    )
    return super().form_invalid(form)

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/project.py
def form_valid(self, form):
    with transaction.atomic():
        form.instance.approver = self.request.user
        form.instance.approved_at = timezone.now()
        form.instance.project = self.project
        response = super().form_valid(form)

        old_stage = self.project.status

        messenger(
            MESSAGES.APPROVE_CONTRACT,
            request=self.request,
            user=self.request.user,
            source=self.project,
            related=self.object,
        )
        # remove Project waiting contract review task for staff
        remove_tasks_for_user_group(
            code=PROJECT_WAITING_CONTRACT_REVIEW,
            user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
            related_obj=self.project,
        )

        self.project.status = INVOICING_AND_REPORTING
        self.project.save(update_fields=["status"])

        messenger(
            MESSAGES.PROJECT_TRANSITION,
            request=self.request,
            user=self.request.user,
            source=self.project,
            related=old_stage,
        )
        # add Project waiting invoice task for applicant
        add_task_to_user(
            code=PROJECT_WAITING_INVOICE,
            user=self.project.user,
            related_obj=self.project,
        )

    messages.success(
        self.request,
        _(
            "Contractor documents have been approved."
            " You can receive invoices from vendor now."
        ),
        extra_tags=PROJECT_ACTION_MESSAGE_TAG,
    )
    return response

get_success_url

get_success_url()
Source code in hypha/apply/projects/views/project.py
def get_success_url(self):
    return self.project.get_absolute_url()

BaseProjectDetailView

Bases: ReportingMixin, DetailView

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def dispatch(self, *args, **kwargs):
    project = self.get_object()
    if project.is_in_progress:
        if not hasattr(project, "report_config"):
            ReportConfig.objects.create(project=project)

    return super().dispatch(*args, **kwargs)

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/projects/views/project.py
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["statuses"] = PROJECT_STATUS_CHOICES
    context["current_status_index"] = [
        status for status, _ in PROJECT_STATUS_CHOICES
    ].index(self.object.status)
    context["supporting_documents_configured"] = (
        True if DocumentCategory.objects.count() else False
    )
    context["contracting_documents_configured"] = (
        True if ContractDocumentCategory.objects.count() else False
    )
    return context

CategoryTemplatePrivateMediaView

Bases: PrivateMediaView

storage class-attribute instance-attribute

storage = PrivateStorage()

raise_exception class-attribute instance-attribute

raise_exception = True

get

get(*args, **kwargs)
Source code in hypha/apply/utils/storage.py
def get(self, *args, **kwargs):
    file_to_serve = self.get_media(*args, **kwargs)
    return FileResponse(file_to_serve)

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, *args, **kwargs):
    project_pk = self.kwargs["pk"]
    self.project = get_object_or_404(Project, pk=project_pk)
    self.category_type = kwargs["type"]
    permission, _ = has_permission(
        "project_access",
        self.request.user,
        object=self.project,
        raise_exception=True,
    )
    return super().dispatch(*args, **kwargs)

get_media

get_media(*args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def get_media(self, *args, **kwargs):
    if self.category_type == "project_document":
        category = DocumentCategory.objects.get(pk=kwargs["category_pk"])
    elif self.category_type == "contract_document":
        category = ContractDocumentCategory.objects.get(pk=kwargs["category_pk"])
    else:
        raise Http404
    if not category.template:
        raise Http404
    return category.template

ContractDocumentPrivateMediaView

Bases: UserPassesTestMixin, PrivateMediaView

storage class-attribute instance-attribute

storage = PrivateStorage()

raise_exception class-attribute instance-attribute

raise_exception = True

get

get(*args, **kwargs)
Source code in hypha/apply/utils/storage.py
def get(self, *args, **kwargs):
    file_to_serve = self.get_media(*args, **kwargs)
    return FileResponse(file_to_serve)

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, *args, **kwargs):
    project_pk = self.kwargs["pk"]
    self.project = get_object_or_404(Project, pk=project_pk)
    return super().dispatch(*args, **kwargs)

get_media

get_media(*args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def get_media(self, *args, **kwargs):
    document = ContractPacketFile.objects.get(pk=kwargs["file_pk"])
    if document.project != self.project:
        raise Http404
    return document.document

test_func

test_func()
Source code in hypha/apply/projects/views/project.py
def test_func(self):
    if self.request.user.is_apply_staff or self.request.user.is_contracting:
        return True

    if self.request.user == self.project.user:
        return True

    return False

ContractPrivateMediaView

Bases: UserPassesTestMixin, PrivateMediaView

storage class-attribute instance-attribute

storage = PrivateStorage()

raise_exception class-attribute instance-attribute

raise_exception = True

get

get(*args, **kwargs)
Source code in hypha/apply/utils/storage.py
def get(self, *args, **kwargs):
    file_to_serve = self.get_media(*args, **kwargs)
    return FileResponse(file_to_serve)

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, *args, **kwargs):
    project_pk = self.kwargs["pk"]
    self.project = get_object_or_404(Project, pk=project_pk)
    return super().dispatch(*args, **kwargs)

get_media

get_media(*args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def get_media(self, *args, **kwargs):
    document = Contract.objects.get(pk=kwargs["file_pk"])
    if document.project != self.project:
        raise Http404
    return document.file

test_func

test_func()
Source code in hypha/apply/projects/views/project.py
def test_func(self):
    if self.request.user.is_apply_staff or self.request.user.is_contracting:
        return True

    if self.request.user == self.project.user:
        return True

    return False

ProjectApprovalFormEditView

Bases: BaseStreamForm, UpdateView

submission_form_class class-attribute instance-attribute

submission_form_class = PageStreamBaseForm

wagtail_reference_index_ignore class-attribute instance-attribute

wagtail_reference_index_ignore = True

model class-attribute instance-attribute

model = Project

template_name class-attribute instance-attribute

template_name = 'application_projects/project_approval_form.html'

paf_form class-attribute instance-attribute

paf_form = None

sow_form class-attribute instance-attribute

sow_form = None

from_db classmethod

from_db(db, field_names, values)
Source code in hypha/apply/stream_forms/models.py
@classmethod
def from_db(cls, db, field_names, values):
    instance = super().from_db(db, field_names, values)
    if "form_data" in field_names:
        instance.form_data = cls.deserialize_form_data(
            instance, instance.form_data, instance.form_fields
        )
    return instance

deserialize_form_data classmethod

deserialize_form_data(instance, form_data, form_fields)
Source code in hypha/apply/stream_forms/models.py
@classmethod
def deserialize_form_data(cls, instance, form_data, form_fields):
    data = form_data.copy()
    # PERFORMANCE NOTE:
    # Do not attempt to iterate over form_fields - that will fully instantiate the form_fields
    # including any sub queries that they do
    for _i, field_data in enumerate(form_fields.raw_data):
        block = form_fields.stream_block.child_blocks[field_data["type"]]
        field_id = field_data.get("id")
        try:
            value = data[field_id]
        except KeyError:
            pass
        else:
            data[field_id] = block.decode(value)
    return data

get_form_fields

get_form_fields(draft=False, form_data=None, user=None)
Source code in hypha/apply/stream_forms/models.py
def get_form_fields(self, draft=False, form_data=None, user=None):
    if form_data is None:
        form_data = {}

    form_fields = OrderedDict()
    field_blocks = self.get_defined_fields()
    group_counter = 1
    is_in_group = False

    # If true option 1 is selected
    grouped_fields_visible = False
    for struct_child in field_blocks:
        block = struct_child.block
        struct_value = struct_child.value
        if isinstance(block, FormFieldBlock):
            field_from_block = block.get_field(struct_value)
            disabled_help_text = _(
                "You are logged in so this information is fetched from your user account."
            )
            if isinstance(block, FullNameBlock) and user and user.is_authenticated:
                if user.full_name:
                    field_from_block.disabled = True
                    field_from_block.initial = user.full_name
                    field_from_block.help_text = disabled_help_text
                else:
                    field_from_block.help_text = _(
                        "You are logged in but your user account does not have a "
                        "full name. We'll update your user account with the name you provide here."
                    )
            if isinstance(block, EmailBlock) and user and user.is_authenticated:
                field_from_block.disabled = True
                field_from_block.initial = user.email
                field_from_block.help_text = disabled_help_text
            if draft and not issubclass(
                block.__class__, ApplicationMustIncludeFieldBlock
            ):
                field_from_block.required = False
            field_from_block.help_link = struct_value.get("help_link")
            field_from_block.group_number = group_counter if is_in_group else 1
            if isinstance(block, GroupToggleBlock) and not is_in_group:
                field_from_block.group_number = 1
                field_from_block.grouper_for = group_counter + 1
                group_counter += 1
                is_in_group = True
                grouped_fields_visible = (
                    form_data.get(struct_child.id) == field_from_block.choices[0][0]
                )
            if isinstance(block, TextFieldBlock):
                field_from_block.word_limit = struct_value.get("word_limit")
            if isinstance(block, MultiInputCharFieldBlock):
                number_of_inputs = struct_value.get("number_of_inputs")
                for index in range(number_of_inputs):
                    form_fields[struct_child.id + "_" + str(index)] = (
                        field_from_block
                    )
                    field_from_block.multi_input_id = struct_child.id
                    field_from_block.add_button_text = struct_value.get(
                        "add_button_text"
                    )
                    if (
                        index == number_of_inputs - 1
                    ):  # Add button after last input field
                        field_from_block.multi_input_add_button = True
                        # Index for field until which fields will be visible to applicant.
                        # Initially only the first field with id UUID_0 will be visible.
                        field_from_block.visibility_index = 0
                        field_from_block.max_index = index
                    if index != 0:
                        field_from_block.multi_input_field = True
                        field_from_block.required = False
                        field_from_block.initial = None
                    field_from_block = copy.copy(field_from_block)
            else:
                if is_in_group and not isinstance(block, GroupToggleBlock):
                    field_from_block.required_when_visible = (
                        field_from_block.required
                    )
                    field_from_block.required = (
                        field_from_block.required & grouped_fields_visible
                    )
                    field_from_block.visible = grouped_fields_visible
                form_fields[struct_child.id] = field_from_block
        elif isinstance(block, GroupToggleEndBlock):
            # Group toggle end block is used only to group fields and not used in actual form.
            # Todo: Use streamblock to create nested form field blocks, a more elegant method to group form fields.
            is_in_group = False
        else:
            field_wrapper = BlockFieldWrapper(struct_child)
            field_wrapper.group_number = group_counter if is_in_group else 1
            form_fields[struct_child.id] = field_wrapper

    return form_fields

buttons

buttons()
Source code in hypha/apply/projects/views/project.py
def buttons(self):
    yield ("submit", "primary", _("Save"))

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, request, *args, **kwargs):
    self.object = self.get_object()
    if not self.object.editable_by(request.user):
        messages.info(
            self.request, _("You are not allowed to edit the project at this time")
        )
        return redirect(self.object)
    return super().dispatch(request, *args, **kwargs)

approval_form

approval_form()
Source code in hypha/apply/projects/views/project.py
@cached_property
def approval_form(self):
    # fetching from the fund directly instead of going through round
    approval_form = (
        self.object.submission.page.specific.approval_forms.first()
    )  # picking up the first one

    return approval_form

approval_sow_form

approval_sow_form()
Source code in hypha/apply/projects/views/project.py
@cached_property
def approval_sow_form(self):
    # fetching from the fund directly instead of going through round
    approval_sow_form = (
        self.object.submission.page.specific.sow_forms.first()
    )  # picking up the first one

    return approval_sow_form

get_form_class

get_form_class(form_class, draft=False, form_data=None, user=None)
Source code in hypha/apply/projects/views/project.py
def get_form_class(self, form_class, draft=False, form_data=None, user=None):
    return type(
        "WagtailStreamForm",
        (form_class,),
        self.get_form_fields(draft, form_data, user),
    )

get_paf_form

get_paf_form(form_class=None)
Source code in hypha/apply/projects/views/project.py
def get_paf_form(self, form_class=None):
    if form_class is None:
        form_class = self.get_form_class(ProjectApprovalForm)
    return form_class(**self.get_paf_form_kwargs())

get_sow_form

get_sow_form(form_class=None)
Source code in hypha/apply/projects/views/project.py
def get_sow_form(self, form_class=None):
    if form_class is None:
        form_class = self.get_form_class(ProjectSOWForm)
    return form_class(**self.get_sow_form_kwargs())

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/projects/views/project.py
def get_context_data(self, **kwargs):
    self.paf_form = self.get_paf_form()
    if self.approval_sow_form:
        self.sow_form = self.get_sow_form()

    submission_attachments = []
    for _field, files in self.object.submission.extract_files().items():
        if isinstance(files, list):
            submission_attachments.extend(files)
        else:
            submission_attachments.append(files)

    return {
        "title": self.object.title,
        "buttons": self.buttons(),
        "approval_form_exists": True if self.approval_form else False,
        "sow_form_exists": True if self.approval_sow_form else False,
        "paf_form": self.paf_form,
        "sow_form": self.sow_form,
        "object": self.object,
        "submissions_attachments": submission_attachments,
        **kwargs,
    }

get_paf_form_fields

get_paf_form_fields()
Source code in hypha/apply/projects/views/project.py
def get_paf_form_fields(self):
    return self.object.form_fields or self.approval_form.form.form_fields

get_sow_form_fields

get_sow_form_fields()
Source code in hypha/apply/projects/views/project.py
def get_sow_form_fields(self):
    if hasattr(self.object, "sow"):
        return (
            self.object.sow.form_fields or self.approval_sow_form.form.form_fields
        )
    return self.approval_sow_form.form.form_fields

get_defined_fields

get_defined_fields()
Source code in hypha/apply/projects/views/project.py
def get_defined_fields(self):
    approval_form = self.approval_form
    if approval_form and not self.paf_form:
        return self.get_paf_form_fields()
    if self.approval_sow_form and self.paf_form and not self.sow_form:
        return self.get_sow_form_fields()
    return self.object.get_defined_fields()

get_paf_form_kwargs

get_paf_form_kwargs()
Source code in hypha/apply/projects/views/project.py
def get_paf_form_kwargs(self):
    kwargs = super().get_form_kwargs()

    if self.approval_form:
        fields = self.approval_form.form.get_form_fields()
    else:
        fields = {}

    kwargs["extra_fields"] = fields
    initial = self.object.raw_data
    for field_id in self.object.file_field_ids:
        initial.pop(field_id + "-uploads", False)
        initial[field_id] = self.get_placeholder_file(
            self.object.raw_data.get(field_id)
        )
    kwargs["initial"].update(initial)
    return kwargs

get_placeholder_file

get_placeholder_file(initial_file)
Source code in hypha/apply/projects/views/project.py
def get_placeholder_file(self, initial_file):
    if not isinstance(initial_file, list):
        return PlaceholderUploadedFile(
            initial_file.filename, size=initial_file.size, file_id=initial_file.name
        )
    return [
        PlaceholderUploadedFile(f.filename, size=f.size, file_id=f.name)
        for f in initial_file
    ]

get_sow_form_kwargs

get_sow_form_kwargs()
Source code in hypha/apply/projects/views/project.py
def get_sow_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    if self.approval_sow_form:
        fields = self.approval_sow_form.form.get_form_fields()

        kwargs["extra_fields"] = fields
        try:
            sow_instance = self.object.sow
            initial = sow_instance.raw_data
            for field_id in sow_instance.file_field_ids:
                initial.pop(field_id + "-uploads", False)
                initial[field_id] = self.get_placeholder_file(
                    sow_instance.raw_data.get(field_id)
                )
            initial["project"] = self.object
            kwargs["initial"].update(initial)
        except ObjectDoesNotExist:
            kwargs["initial"].update({"project": self.object})
    return kwargs

post

post(request, *args, **kwargs)

Handle POST requests: instantiate a form instance with the passed POST variables and then check if it's valid.

Source code in hypha/apply/projects/views/project.py
def post(self, request, *args, **kwargs):
    """
    Handle POST requests: instantiate a form instance with the passed
    POST variables and then check if it's valid.
    """

    self.paf_form = self.get_paf_form()
    if self.approval_sow_form:
        self.sow_form = self.get_sow_form()
        if self.paf_form.is_valid() and self.sow_form.is_valid():
            # if both forms exists, both needs to be valid together
            try:
                paf_form_fields = self.get_paf_form_fields()
            except AttributeError:
                paf_form_fields = []
            try:
                sow_form_fields = self.get_sow_form_fields()
            except AttributeError:
                sow_form_fields = []

            self.paf_form.save(paf_form_fields=paf_form_fields)
            self.sow_form.save(sow_form_fields=sow_form_fields, project=self.object)
            self.paf_form.delete_temporary_files()
            self.sow_form.delete_temporary_files()
            # remove PAF addition task for staff group
            remove_tasks_for_user_group(
                code=PROJECT_WAITING_PAF,
                user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
                related_obj=self.object,
            )
            # add PAF submission task for staff group
            add_task_to_user_group(
                code=PROJECT_SUBMIT_PAF,
                user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
                related_obj=self.object,
            )
            return HttpResponseRedirect(self.get_success_url())
        else:
            if not self.paf_form.is_valid():
                return self.form_invalid(self.paf_form)
            return self.form_invalid(self.sow_form)
    else:
        if self.paf_form.is_valid():
            # paf can exist alone also, it needs to be valid
            try:
                paf_form_fields = self.get_paf_form_fields()
            except AttributeError:
                paf_form_fields = []
            self.paf_form.save(paf_form_fields=paf_form_fields)
            self.paf_form.delete_temporary_files()
            # remove PAF addition task for staff group
            remove_tasks_for_user_group(
                code=PROJECT_WAITING_PAF,
                user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
                related_obj=self.object,
            )
            # add PAF submission task for staff group
            add_task_to_user_group(
                code=PROJECT_SUBMIT_PAF,
                user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
                related_obj=self.object,
            )
            return HttpResponseRedirect(self.get_success_url())
        else:
            return self.form_invalid(self.paf_form)

ProjectDetailApprovalView

ProjectDetailApprovalView(*args, **kwargs)

Bases: DelegateableView, DetailView

Source code in hypha/apply/utils/views.py
def __init__(self, *args, **kwargs):
    self._form_views = {
        self.form_prefix + form_view.context_name: form_view
        for form_view in self.form_views
    }

form_prefix class-attribute instance-attribute

form_prefix = 'form-submitted-'

form_views class-attribute instance-attribute

model class-attribute instance-attribute

model = Project

template_name_suffix class-attribute instance-attribute

template_name_suffix = '_approval_detail'

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/utils/views.py
def get_form_kwargs(self):
    return {
        "user": self.request.user,
        "instance": self.object,
    }

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    forms = {}
    for form_view in self._form_views.values():
        view = form_view()
        view.setup(self.request, self.args, self.kwargs)
        context_key, form = view.contribute_form(self)
        forms[context_key] = form

    return super().get_context_data(
        form_prefix=self.form_prefix,
        **forms,
        **kwargs,
    )

post

post(request, *args, **kwargs)
Source code in hypha/apply/utils/views.py
def post(self, request, *args, **kwargs):
    self.object = self.get_object()

    kwargs["object"] = self.object

    return super().post(request, *args, **kwargs)

ProjectDetailDownloadView

Bases: SingleObjectMixin, View

model class-attribute instance-attribute

model = Project

get

get(request, *args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def get(self, request, *args, **kwargs):
    export_type = kwargs.get("export_type", None)
    self.object = self.get_object()
    context = self.get_paf_download_context()
    template_path = "application_projects/paf_export.html"

    if export_type == "pdf":
        pdf_page_settings = PDFPageSettings.for_request(request)

        context["show_footer"] = True
        context["export_date"] = datetime.date.today().strftime("%b %d, %Y")
        context["export_user"] = request.user
        context["pagesize"] = pdf_page_settings.download_page_size

        return self.render_as_pdf(
            context=context,
            template=get_template(template_path),
            filename=self.get_slugified_file_name(export_type),
        )
    elif export_type == "docx":
        context["show_footer"] = False

        return self.render_as_docx(
            context=context,
            template=get_template(template_path),
            filename=self.get_slugified_file_name(export_type),
        )
    else:
        raise Http404(f"{export_type} type not supported at the moment")

render_as_pdf

render_as_pdf(context, template, filename)
Source code in hypha/apply/projects/views/project.py
def render_as_pdf(self, context, template, filename):
    html = template.render(context)
    response = HttpResponse(content_type="application/pdf")
    response["Content-Disposition"] = f"attachment; filename={filename}"

    pisa_status = pisa.CreatePDF(
        html, dest=response, encoding="utf-8", raise_exception=True
    )
    if pisa_status.err:
        # :todo: needs to handle it in a better way
        raise Http404("PDF type not supported at the moment")
    return response

render_as_docx

render_as_docx(context, template, filename)
Source code in hypha/apply/projects/views/project.py
def render_as_docx(self, context, template, filename):
    html = template.render(context)

    buf = io.BytesIO()
    document = Document()
    new_parser = HtmlToDocx()
    new_parser.add_html_to_document(html, document)
    document.save(buf)

    response = HttpResponse(buf.getvalue(), content_type="application/docx")
    response["Content-Disposition"] = f"attachment; filename={filename}"
    return response

get_slugified_file_name

get_slugified_file_name(export_type)
Source code in hypha/apply/projects/views/project.py
def get_slugified_file_name(self, export_type):
    return f"{datetime.date.today().strftime('%Y%m%d')}-{slugify(self.object.title)}.{export_type}"

get_paf_download_context

get_paf_download_context()
Source code in hypha/apply/projects/views/project.py
def get_paf_download_context(self):
    context = {}
    context["id"] = self.object.id
    context["title"] = self.object.title
    context["project_link"] = self.request.build_absolute_uri(
        reverse("apply:projects:detail", kwargs={"pk": self.object.id})
    )
    context["contractor_name"] = (
        self.object.vendor.contractor_name if self.object.vendor else None
    )

    context["approvals"] = self.object.paf_approvals.all()
    context["paf_data"] = self.get_paf_data_with_field(self.object)
    context["sow_data"] = self.get_sow_data_with_field(self.object)
    context["submission"] = self.object.submission
    context["submission_link"] = self.request.build_absolute_uri(
        reverse(
            "apply:submissions:detail", kwargs={"pk": self.object.submission.id}
        )
    )
    context["supporting_documents"] = self.get_supporting_documents(self.object)
    context["org_name"] = settings.ORG_LONG_NAME
    return context

get_paf_data_with_field

get_paf_data_with_field(project)
Source code in hypha/apply/projects/views/project.py
def get_paf_data_with_field(self, project):
    data_dict = {}
    form_data_dict = project.form_data
    for field in project.form_fields.raw_data:
        if field.get("type", None) in ["file", "multi_file"]:
            continue
        if field["id"] in form_data_dict.keys():
            if isinstance(field["value"], dict) and "field_label" in field["value"]:
                data_dict[field["value"]["field_label"]] = form_data_dict[
                    field["id"]
                ]

    return data_dict

get_sow_data_with_field

get_sow_data_with_field(project)
Source code in hypha/apply/projects/views/project.py
def get_sow_data_with_field(self, project):
    data_dict = {}
    if project.submission.page.specific.sow_forms.exists() and project.sow:
        form_data_dict = project.sow.form_data
        for field in project.sow.form_fields.raw_data:
            if field.get("type", None) in ["file", "multi_file"]:
                continue
            if field["id"] in form_data_dict.keys():
                if (
                    isinstance(field["value"], dict)
                    and "field_label" in field["value"]
                ):
                    data_dict[field["value"]["field_label"]] = form_data_dict[
                        field["id"]
                    ]

    return data_dict

get_supporting_documents

get_supporting_documents(project)
Source code in hypha/apply/projects/views/project.py
def get_supporting_documents(self, project):
    documents_dict = {}
    for packet_file in project.packet_files.all():
        documents_dict[packet_file.title] = self.request.build_absolute_uri(
            reverse(
                "apply:projects:document",
                kwargs={"pk": project.id, "file_pk": packet_file.id},
            )
        )
    return documents_dict

ProjectDetailView

Bases: ViewDispatcher

reviewer_view class-attribute instance-attribute

reviewer_view = None

partner_view class-attribute instance-attribute

partner_view = None

community_view class-attribute instance-attribute

community_view = None

admin_view class-attribute instance-attribute

finance_view class-attribute instance-attribute

finance_view = AdminProjectDetailView

contracting_view class-attribute instance-attribute

contracting_view = AdminProjectDetailView

applicant_view class-attribute instance-attribute

applicant_view = ApplicantProjectDetailView

admin_check

admin_check(request)
Source code in hypha/apply/utils/views.py
def admin_check(self, request):
    return request.user.is_apply_staff

reviewer_check

reviewer_check(request)
Source code in hypha/apply/utils/views.py
def reviewer_check(self, request):
    return request.user.is_reviewer

partner_check

partner_check(request)
Source code in hypha/apply/utils/views.py
def partner_check(self, request):
    return request.user.is_partner

community_check

community_check(request)
Source code in hypha/apply/utils/views.py
def community_check(self, request):
    return request.user.is_community_reviewer

finance_check

finance_check(request)
Source code in hypha/apply/utils/views.py
def finance_check(self, request):
    return request.user.is_finance

contracting_check

contracting_check(request)
Source code in hypha/apply/utils/views.py
def contracting_check(self, request):
    return request.user.is_contracting

applicant_check

applicant_check(request)
Source code in hypha/apply/utils/views.py
def applicant_check(self, request):
    return request.user.is_applicant

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/utils/views.py
def dispatch(self, request, *args, **kwargs):
    view = None

    if self.admin_check(request):
        view = self.admin_view
    elif self.reviewer_check(request):
        view = self.reviewer_view
    elif self.partner_check(request):
        view = self.partner_view
    elif self.community_check(request):
        view = self.community_view
    elif self.finance_check(request):
        view = self.finance_view
    elif self.contracting_check(request):
        view = self.contracting_view
    elif self.applicant_check(request):
        view = self.applicant_view

    if view:
        return view.as_view()(request, *args, **kwargs)
    return HttpResponseForbidden()

ProjectListView

Bases: SingleTableMixin, FilterView

filterset_class class-attribute instance-attribute

filterset_class = ProjectListFilter

queryset class-attribute instance-attribute

queryset = for_table()

table_class class-attribute instance-attribute

table_class = ProjectsListTable

template_name class-attribute instance-attribute

template_name = 'application_projects/project_list.html'

ProjectOverviewView

Bases: TemplateView

template_name class-attribute instance-attribute

template_name = 'application_projects/overview.html'

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/projects/views/project.py
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["projects"] = self.get_projects(self.request)
    context["invoices"] = self.get_invoices(self.request)
    context["reports"] = self.get_reports(self.request)
    context["status_counts"] = self.get_status_counts()
    return context

get_reports

get_reports(request)
Source code in hypha/apply/projects/views/project.py
def get_reports(self, request):
    if request.user.is_contracting:
        return {
            "filterset": None,
            "table": None,
            "url": None,
        }
    reports = Report.objects.for_table().submitted()[:10]
    return {
        "filterset": ReportListFilter(
            request.GET or None, request=request, queryset=reports
        ),
        "table": ReportListTable(reports, order_by=()),
        "url": reverse("apply:projects:reports:all"),
    }

get_projects

get_projects(request)
Source code in hypha/apply/projects/views/project.py
def get_projects(self, request):
    projects = Project.objects.for_table()[:10]

    return {
        "filterset": ProjectListFilter(
            request.GET or None, request=request, queryset=projects
        ),
        "table": ProjectsListTable(projects, order_by=()),
        "url": reverse("apply:projects:all"),
    }

get_invoices

get_invoices(request)
Source code in hypha/apply/projects/views/project.py
def get_invoices(self, request):
    if request.user.is_contracting:
        return {
            "filterset": None,
            "table": None,
            "url": None,
        }
    invoices = Invoice.objects.order_by("-requested_at")[:10]

    return {
        "filterset": InvoiceListFilter(
            request.GET or None, request=request, queryset=invoices
        ),
        "table": InvoiceListTable(invoices, order_by=()),
        "url": reverse("apply:projects:invoices"),
    }

get_status_counts

get_status_counts()
Source code in hypha/apply/projects/views/project.py
def get_status_counts(self):
    status_counts = dict(
        Project.objects.all()
        .values("status")
        .annotate(
            count=Count("status"),
        )
        .values_list(
            "status",
            "count",
        )
    )

    return {
        key: {
            "name": display,
            "count": status_counts.get(key, 0),
            "url": reverse_lazy("funds:projects:all") + "?project_status=" + key,
        }
        for key, display in PROJECT_STATUS_CHOICES
    }

ProjectPrivateMediaView

Bases: UserPassesTestMixin, PrivateMediaView

storage class-attribute instance-attribute

storage = PrivateStorage()

raise_exception class-attribute instance-attribute

raise_exception = True

get

get(*args, **kwargs)
Source code in hypha/apply/utils/storage.py
def get(self, *args, **kwargs):
    file_to_serve = self.get_media(*args, **kwargs)
    return FileResponse(file_to_serve)

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, *args, **kwargs):
    project_pk = self.kwargs["pk"]
    self.project = get_object_or_404(Project, pk=project_pk)
    return super().dispatch(*args, **kwargs)

get_media

get_media(*args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def get_media(self, *args, **kwargs):
    document = PacketFile.objects.get(pk=kwargs["file_pk"])
    if document.project != self.project:
        raise Http404
    return document.document

test_func

test_func()
Source code in hypha/apply/projects/views/project.py
def test_func(self):
    if self.request.user.is_apply_staff:
        return True

    if self.request.user == self.project.user:
        return True

    if self.request.user.id in self.project.paf_approvals.filter(
        approved=False
    ).values_list("user__id", flat=True):
        return True

    return False

ProjectSOWDownloadView

Bases: SingleObjectMixin, View

model class-attribute instance-attribute

model = Project

get

get(request, *args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def get(self, request, *args, **kwargs):
    export_type = kwargs.get("export_type", "pdf")
    self.object = self.get_object()
    context = {}
    context["sow_data"] = self.get_sow_data_with_field(self.object)
    context["org_name"] = settings.ORG_LONG_NAME
    context["title"] = self.object.title
    context["project_link"] = self.request.build_absolute_uri(
        reverse("apply:projects:detail", kwargs={"pk": self.object.id})
    )
    template_path = "application_projects/sow_export.html"

    if export_type == "pdf":
        pdf_page_settings = PDFPageSettings.for_request(request)

        context["show_footer"] = True
        context["export_date"] = datetime.date.today().strftime("%b %d, %Y")
        context["export_user"] = request.user
        context["pagesize"] = pdf_page_settings.download_page_size

        return self.render_as_pdf(
            context=context,
            template=get_template(template_path),
            filename=self.get_slugified_file_name(export_type),
        )
    elif export_type == "docx":
        context["show_footer"] = False

        return self.render_as_docx(
            context=context,
            template=get_template(template_path),
            filename=self.get_slugified_file_name(export_type),
        )
    else:
        raise Http404(f"{export_type} type not supported at the moment")

render_as_pdf

render_as_pdf(context, template, filename)
Source code in hypha/apply/projects/views/project.py
def render_as_pdf(self, context, template, filename):
    html = template.render(context)
    response = HttpResponse(content_type="application/pdf")
    response["Content-Disposition"] = f"attachment; filename={filename}"

    pisa_status = pisa.CreatePDF(
        html, dest=response, encoding="utf-8", raise_exception=True
    )
    if pisa_status.err:
        # :todo: needs to handle it in a better way
        raise Http404("PDF type not supported at the moment")
    return response

render_as_docx

render_as_docx(context, template, filename)
Source code in hypha/apply/projects/views/project.py
def render_as_docx(self, context, template, filename):
    html = template.render(context)

    buf = io.BytesIO()
    document = Document()
    new_parser = HtmlToDocx()
    new_parser.add_html_to_document(html, document)
    document.save(buf)

    response = HttpResponse(buf.getvalue(), content_type="application/docx")
    response["Content-Disposition"] = f"attachment; filename={filename}"
    return response

get_slugified_file_name

get_slugified_file_name(export_type)
Source code in hypha/apply/projects/views/project.py
def get_slugified_file_name(self, export_type):
    return f"{datetime.date.today().strftime('%Y%m%d')}-{slugify(self.object.title)}.{export_type}"

get_sow_data_with_field

get_sow_data_with_field(project)
Source code in hypha/apply/projects/views/project.py
def get_sow_data_with_field(self, project):
    data_dict = {}
    if project.submission.page.specific.sow_forms.exists() and project.sow:
        form_data_dict = project.sow.form_data
        for field in project.sow.form_fields.raw_data:
            if field.get("type", None) in ["file", "multi_file"]:
                continue
            if field["id"] in form_data_dict.keys():
                if (
                    isinstance(field["value"], dict)
                    and "field_label" in field["value"]
                ):
                    data_dict[field["value"]["field_label"]] = form_data_dict[
                        field["id"]
                    ]

    return data_dict

ProjectSOWView

Bases: DetailView

model class-attribute instance-attribute

model = Project

template_name_suffix class-attribute instance-attribute

template_name_suffix = '_sow_detail'

RemoveDocumentView

Bases: DelegatedViewMixin, FormView

context_name class-attribute instance-attribute

context_name = 'remove_document_form'

form_class class-attribute instance-attribute

form_class = RemoveDocumentForm

model class-attribute instance-attribute

model = Project

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_object

get_object()
Source code in hypha/apply/utils/views.py
def get_object(self):
    # Make sure the form instance, bound at the parent class level,  is the same as the
    # value we work with on the class.
    # If we don't have self.object, bind the parent instance to it. This value will then
    # be used by the form. Any further calls to get_object will get a new instance of the object
    if not hasattr(self, "object"):
        parent_object = self.get_parent_object()
        if isinstance(parent_object, self.model):
            return parent_object

    return super().get_object()

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/utils/views.py
def get_form_kwargs(self):
    form_kwargs = super().get_form_kwargs()
    form_kwargs["user"] = self.request.user
    form_kwargs.update(**self.get_parent_kwargs())
    return form_kwargs

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_form

get_form(*args, **kwargs)
Source code in hypha/apply/utils/views.py
def get_form(self, *args, **kwargs):
    form = super().get_form(*args, **kwargs)
    form.name = self.get_form_name()
    return form

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_success_url

get_success_url()
Source code in hypha/apply/utils/views.py
def get_success_url(self):
    query = self.request.GET.urlencode()
    if query:
        query = "?" + query
    return self.request.path + query

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/project.py
def form_valid(self, form):
    document_id = form.cleaned_data["id"]
    project = self.kwargs["object"]

    try:
        project.packet_files.get(pk=document_id).delete()
    except PacketFile.DoesNotExist:
        pass

    messages.success(
        self.request,
        _("Document has been removed"),
        extra_tags=PROJECT_ACTION_MESSAGE_TAG,
    )
    return redirect(project)

SelectDocumentView

Bases: DelegatedViewMixin, CreateView

form_class class-attribute instance-attribute

form_class = SelectDocumentForm

context_name class-attribute instance-attribute

context_name = 'select_document_form'

model class-attribute instance-attribute

model = PacketFile

should_show property

should_show

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_object

get_object()
Source code in hypha/apply/utils/views.py
def get_object(self):
    # Make sure the form instance, bound at the parent class level,  is the same as the
    # value we work with on the class.
    # If we don't have self.object, bind the parent instance to it. This value will then
    # be used by the form. Any further calls to get_object will get a new instance of the object
    if not hasattr(self, "object"):
        parent_object = self.get_parent_object()
        if isinstance(parent_object, self.model):
            return parent_object

    return super().get_object()

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_form

get_form(*args, **kwargs)
Source code in hypha/apply/utils/views.py
def get_form(self, *args, **kwargs):
    form = super().get_form(*args, **kwargs)
    form.name = self.get_form_name()
    return form

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_success_url

get_success_url()
Source code in hypha/apply/utils/views.py
def get_success_url(self):
    query = self.request.GET.urlencode()
    if query:
        query = "?" + query
    return self.request.path + query

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, request, *args, **kwargs):
    self.project = get_object_or_404(Project, pk=self.kwargs["pk"])
    return super().dispatch(request, *args, **kwargs)

form_invalid

form_invalid(form)
Source code in hypha/apply/projects/views/project.py
def form_invalid(self, form):
    for error in form.errors:
        messages.error(self.request, error)

    return redirect(self.project)

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/project.py
def form_valid(self, form):
    form.instance.project = self.project
    form.instance.name = form.instance.document.name

    response = super().form_valid(form)

    messenger(
        MESSAGES.UPLOAD_DOCUMENT,
        request=self.request,
        user=self.request.user,
        source=self.project,
    )

    return response

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/projects/views/project.py
def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs.pop("user")
    kwargs.pop("instance")
    kwargs["existing_files"] = get_files(self.get_parent_object())
    return kwargs

SendForApprovalView

Bases: DelegatedViewMixin, UpdateView

context_name class-attribute instance-attribute

context_name = 'request_approval_form'

form_class class-attribute instance-attribute

form_class = SetPendingForm

model class-attribute instance-attribute

model = Project

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_object

get_object()
Source code in hypha/apply/utils/views.py
def get_object(self):
    # Make sure the form instance, bound at the parent class level,  is the same as the
    # value we work with on the class.
    # If we don't have self.object, bind the parent instance to it. This value will then
    # be used by the form. Any further calls to get_object will get a new instance of the object
    if not hasattr(self, "object"):
        parent_object = self.get_parent_object()
        if isinstance(parent_object, self.model):
            return parent_object

    return super().get_object()

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/utils/views.py
def get_form_kwargs(self):
    form_kwargs = super().get_form_kwargs()
    form_kwargs["user"] = self.request.user
    form_kwargs.update(**self.get_parent_kwargs())
    return form_kwargs

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_form

get_form(*args, **kwargs)
Source code in hypha/apply/utils/views.py
def get_form(self, *args, **kwargs):
    form = super().get_form(*args, **kwargs)
    form.name = self.get_form_name()
    return form

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_success_url

get_success_url()
Source code in hypha/apply/utils/views.py
def get_success_url(self):
    query = self.request.GET.urlencode()
    if query:
        query = "?" + query
    return self.request.path + query

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/project.py
def form_valid(self, form):
    project = self.kwargs["object"]
    old_stage = project.status

    response = super().form_valid(form)

    # remove PAF submission task for staff group
    remove_tasks_for_user_group(
        code=PROJECT_SUBMIT_PAF,
        user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
        related_obj=self.object,
    )

    # remove PAF rejection task for staff if exists
    remove_tasks_for_user_group(
        code=PAF_REQUIRED_CHANGES,
        user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
        related_obj=self.object,
    )

    project_settings = ProjectSettings.for_request(self.request)

    paf_approvals = self.object.paf_approvals.filter(approved=False)

    if project_settings.paf_approval_sequential:
        if paf_approvals:
            user = paf_approvals.first().user
            if user:
                # notify only if first user/approver is updated
                messenger(
                    MESSAGES.SEND_FOR_APPROVAL,
                    request=self.request,
                    user=self.request.user,
                    source=self.object,
                )
                messenger(
                    MESSAGES.APPROVE_PAF,
                    request=self.request,
                    user=self.request.user,
                    source=self.object,
                    related=[paf_approvals.first()],
                )
                # add PAF waiting approval task for paf_approval user
                add_task_to_user(
                    code=PAF_WAITING_APPROVAL, user=user, related_obj=self.object
                )
            else:
                messenger(
                    MESSAGES.ASSIGN_PAF_APPROVER,
                    request=self.request,
                    user=self.request.user,
                    source=self.object,
                )
                # add PAF waiting assignee task for paf_approval reviewer_roles
                add_task_to_user_group(
                    code=PAF_WAITING_ASSIGNEE,
                    user_group=paf_approvals.first().paf_reviewer_role.user_roles.all(),
                    related_obj=self.object,
                )
    else:
        if paf_approvals.filter(user__isnull=False).exists():
            messenger(
                MESSAGES.SEND_FOR_APPROVAL,
                request=self.request,
                user=self.request.user,
                source=self.object,
            )
            messenger(
                MESSAGES.APPROVE_PAF,
                request=self.request,
                user=self.request.user,
                source=self.object,
                related=paf_approvals.filter(user__isnull=False),
            )
            # add PAF waiting approval task for paf_approvals users
            for paf_approval in paf_approvals.filter(user__isnull=False):
                add_task_to_user(
                    code=PAF_WAITING_APPROVAL,
                    user=paf_approval.user,
                    related_obj=self.object,
                )
        if paf_approvals.filter(user__isnull=True).exists():
            messenger(
                MESSAGES.ASSIGN_PAF_APPROVER,
                request=self.request,
                user=self.request.user,
                source=self.object,
            )
            # add PAF waiting assignee task for paf_approvals reviewer_roles
            for paf_approval in paf_approvals.filter(user__isnull=True):
                add_task_to_user_group(
                    code=PAF_WAITING_ASSIGNEE,
                    user_group=paf_approval.paf_reviewer_role.user_roles.all(),
                    related_obj=self.object,
                )

    project.status = INTERNAL_APPROVAL
    project.save(update_fields=["status"])

    messenger(
        MESSAGES.PROJECT_TRANSITION,
        request=self.request,
        user=self.request.user,
        source=project,
        related=old_stage,
    )

    messages.success(
        self.request,
        _("PAF has been submitted for approval"),
        extra_tags=PROJECT_ACTION_MESSAGE_TAG,
    )
    return response

UpdateLeadView

Bases: DelegatedViewMixin, UpdateView

model class-attribute instance-attribute

model = Project

form_class class-attribute instance-attribute

form_class = UpdateProjectLeadForm

context_name class-attribute instance-attribute

context_name = 'lead_form'

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_object

get_object()
Source code in hypha/apply/utils/views.py
def get_object(self):
    # Make sure the form instance, bound at the parent class level,  is the same as the
    # value we work with on the class.
    # If we don't have self.object, bind the parent instance to it. This value will then
    # be used by the form. Any further calls to get_object will get a new instance of the object
    if not hasattr(self, "object"):
        parent_object = self.get_parent_object()
        if isinstance(parent_object, self.model):
            return parent_object

    return super().get_object()

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/utils/views.py
def get_form_kwargs(self):
    form_kwargs = super().get_form_kwargs()
    form_kwargs["user"] = self.request.user
    form_kwargs.update(**self.get_parent_kwargs())
    return form_kwargs

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_form

get_form(*args, **kwargs)
Source code in hypha/apply/utils/views.py
def get_form(self, *args, **kwargs):
    form = super().get_form(*args, **kwargs)
    form.name = self.get_form_name()
    return form

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_success_url

get_success_url()
Source code in hypha/apply/utils/views.py
def get_success_url(self):
    query = self.request.GET.urlencode()
    if query:
        query = "?" + query
    return self.request.path + query

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/project.py
def form_valid(self, form):
    # Fetch the old lead from the database
    old_lead = copy(self.get_object().lead)

    response = super().form_valid(form)
    project = form.instance

    messenger(
        MESSAGES.UPDATE_PROJECT_LEAD,
        request=self.request,
        user=self.request.user,
        source=project,
        related=old_lead or _("Unassigned"),
    )

    messages.success(
        self.request,
        _("Lead has been updated"),
        extra_tags=PROJECT_ACTION_MESSAGE_TAG,
    )
    return response

UploadContractView

Bases: DelegatedViewMixin, CreateView

context_name class-attribute instance-attribute

context_name = 'contract_form'

model class-attribute instance-attribute

model = Project

form_class class-attribute instance-attribute

form_class = UploadContractForm

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_object

get_object()
Source code in hypha/apply/utils/views.py
def get_object(self):
    # Make sure the form instance, bound at the parent class level,  is the same as the
    # value we work with on the class.
    # If we don't have self.object, bind the parent instance to it. This value will then
    # be used by the form. Any further calls to get_object will get a new instance of the object
    if not hasattr(self, "object"):
        parent_object = self.get_parent_object()
        if isinstance(parent_object, self.model):
            return parent_object

    return super().get_object()

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_form

get_form(*args, **kwargs)
Source code in hypha/apply/utils/views.py
def get_form(self, *args, **kwargs):
    form = super().get_form(*args, **kwargs)
    form.name = self.get_form_name()
    return form

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_success_url

get_success_url()
Source code in hypha/apply/utils/views.py
def get_success_url(self):
    query = self.request.GET.urlencode()
    if query:
        query = "?" + query
    return self.request.path + query

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/project.py
def dispatch(self, request, *args, **kwargs):
    project = self.kwargs["object"]
    permission, _ = has_permission("contract_upload", request.user, object=project)
    if permission:
        return super().dispatch(request, *args, **kwargs)

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/projects/views/project.py
def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs.pop("instance")
    kwargs.pop("user")
    return kwargs

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/project.py
def form_valid(self, form):
    project = self.kwargs["object"]

    if project.contracts.exists():
        form.instance = project.contracts.order_by("created_at").first()

    form.instance.project = project

    if self.request.user == project.user:
        form.instance.signed_by_applicant = True
        form.instance.uploaded_by_applicant_at = timezone.now()
        messages.success(
            self.request,
            _("Countersigned contract uploaded"),
            extra_tags=PROJECT_ACTION_MESSAGE_TAG,
        )
    elif self.request.user.is_contracting:
        # :todo: update same date when staff uploads the contract(with STAFF_UPLOAD_CONTRACT setting)
        form.instance.uploaded_by_contractor_at = timezone.now()
        messages.success(
            self.request,
            _("Signed contract uploaded"),
            extra_tags=PROJECT_ACTION_MESSAGE_TAG,
        )

    response = super().form_valid(form)

    if self.request.user != project.user:
        messenger(
            MESSAGES.UPLOAD_CONTRACT,
            request=self.request,
            user=self.request.user,
            source=project,
            related=form.instance,
        )
        # remove Project waiting contract task for contracting/staff group
        if settings.STAFF_UPLOAD_CONTRACT:
            remove_tasks_for_user_group(
                code=PROJECT_WAITING_CONTRACT,
                user_group=Group.objects.filter(name=STAFF_GROUP_NAME),
                related_obj=project,
            )
        else:
            remove_tasks_for_user_group(
                code=PROJECT_WAITING_CONTRACT,
                user_group=Group.objects.filter(name=CONTRACTING_GROUP_NAME),
                related_obj=project,
            )
        # add Project waiting contract document task for applicant
        add_task_to_user(
            code=PROJECT_WAITING_CONTRACT_DOCUMENT,
            user=project.user,
            related_obj=project,
        )

    return response

UploadDocumentView

Bases: DelegatedViewMixin, CreateView

context_name class-attribute instance-attribute

context_name = 'document_form'

form_class class-attribute instance-attribute

form_class = UploadDocumentForm

model class-attribute instance-attribute

model = Project

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_object

get_object()
Source code in hypha/apply/utils/views.py
def get_object(self):
    # Make sure the form instance, bound at the parent class level,  is the same as the
    # value we work with on the class.
    # If we don't have self.object, bind the parent instance to it. This value will then
    # be used by the form. Any further calls to get_object will get a new instance of the object
    if not hasattr(self, "object"):
        parent_object = self.get_parent_object()
        if isinstance(parent_object, self.model):
            return parent_object

    return super().get_object()

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/utils/views.py
def get_form_kwargs(self):
    form_kwargs = super().get_form_kwargs()
    form_kwargs["user"] = self.request.user
    form_kwargs.update(**self.get_parent_kwargs())
    return form_kwargs

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_form

get_form(*args, **kwargs)
Source code in hypha/apply/utils/views.py
def get_form(self, *args, **kwargs):
    form = super().get_form(*args, **kwargs)
    form.name = self.get_form_name()
    return form

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_success_url

get_success_url()
Source code in hypha/apply/utils/views.py
def get_success_url(self):
    query = self.request.GET.urlencode()
    if query:
        query = "?" + query
    return self.request.path + query

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/project.py
def form_valid(self, form):
    project = self.kwargs["object"]
    form.instance.project = project
    response = super().form_valid(form)

    messenger(
        MESSAGES.UPLOAD_DOCUMENT,
        request=self.request,
        user=self.request.user,
        source=project,
    )

    messages.success(
        self.request,
        _("Document has been uploaded"),
        extra_tags=PROJECT_ACTION_MESSAGE_TAG,
    )

    return response

ReportDetailView

Bases: DetailView

model class-attribute instance-attribute

model = Report

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def dispatch(self, *args, **kwargs):
    report = self.get_object()
    permission, _ = has_permission(
        "report_view", self.request.user, object=report, raise_exception=True
    )
    return super().dispatch(*args, **kwargs)

ReportFrequencyUpdate

Bases: DelegatedViewMixin, UpdateView

form_class class-attribute instance-attribute

form_class = ReportFrequencyForm

context_name class-attribute instance-attribute

context_name = 'update_frequency_form'

model class-attribute instance-attribute

model = ReportConfig

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_success_url

get_success_url()
Source code in hypha/apply/utils/views.py
def get_success_url(self):
    query = self.request.GET.urlencode()
    if query:
        query = "?" + query
    return self.request.path + query

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/projects/views/report.py
def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs.pop("user")
    project = kwargs["instance"]
    instance = project.report_config
    kwargs["instance"] = instance
    if not instance.disable_reporting:
        # Current due report can be none for ONE_TIME(does not repeat),
        # In case of ONE_TIME, either reporting is already completed(last_report exists)
        # or there should be a current_due_report.
        if instance.current_due_report():
            kwargs["initial"] = {
                "start": instance.current_due_report().end_date,
            }
        else:
            kwargs["initial"] = {
                "start": instance.last_report().end_date,
            }
    else:
        kwargs["initial"] = {
            "start": project.start_date,
        }
    return kwargs

get_object

get_object()
Source code in hypha/apply/projects/views/report.py
def get_object(self):
    project = self.get_parent_object()
    return project.report_config

get_form

get_form()
Source code in hypha/apply/projects/views/report.py
def get_form(self):
    if self.get_parent_object().is_in_progress:
        return super().get_form()
    return None

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/report.py
def form_valid(self, form):
    config = form.instance
    # 'form-submitted-' is set as form_prefix in DelegateBase view
    if "disable-reporting" in self.request.POST.get(
        f"form-submitted-{self.context_name}"
    ):
        form.instance.disable_reporting = True
        form.instance.schedule_start = None
        response = super().form_valid(form)
        messenger(
            MESSAGES.DISABLED_REPORTING,
            request=self.request,
            user=self.request.user,
            source=config.project,
        )
    else:
        form.instance.disable_reporting = False
        form.instance.schedule_start = form.cleaned_data["start"]
        response = super().form_valid(form)
        messenger(
            MESSAGES.REPORT_FREQUENCY_CHANGED,
            request=self.request,
            user=self.request.user,
            source=config.project,
            related=config,
        )

    return response

ReportListView

Bases: SingleTableMixin, FilterView

queryset class-attribute instance-attribute

queryset = for_table()

filterset_class class-attribute instance-attribute

filterset_class = ReportListFilter

table_class class-attribute instance-attribute

table_class = ReportListTable

template_name class-attribute instance-attribute

template_name = 'application_projects/report_list.html'

ReportPrivateMedia

Bases: ReportAccessMixin, PrivateMediaView

storage class-attribute instance-attribute

storage = PrivateStorage()

model class-attribute instance-attribute

model = Report

get

get(*args, **kwargs)
Source code in hypha/apply/utils/storage.py
def get(self, *args, **kwargs):
    file_to_serve = self.get_media(*args, **kwargs)
    return FileResponse(file_to_serve)

test_func

test_func()
Source code in hypha/apply/projects/views/report.py
def test_func(self):
    if self.request.user.is_apply_staff:
        return True

    if self.request.user.is_finance:
        return True

    if self.request.user == self.get_object().project.user:
        return True

    return False

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def dispatch(self, *args, **kwargs):
    report_pk = self.kwargs["pk"]
    self.report = get_object_or_404(Report, pk=report_pk)
    file_pk = kwargs.get("file_pk")
    self.document = get_object_or_404(
        ReportPrivateFiles.objects, report__report=self.report, pk=file_pk
    )

    if not hasattr(self.document.report, "live_for_report"):
        # this is not a document in the live report
        # send the user to the report page to see latest version
        return redirect(self.report.get_absolute_url())

    return super().dispatch(*args, **kwargs)

get_media

get_media(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def get_media(self, *args, **kwargs):
    return self.document.document

ReportSkipView

Bases: SingleObjectMixin, View

model class-attribute instance-attribute

model = Report

post

post(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def post(self, *args, **kwargs):
    report = self.get_object()
    unsubmitted = not report.current
    not_current = report.project.report_config.current_due_report() != report
    if unsubmitted and not_current:
        report.skipped = not report.skipped
        report.save()
        messenger(
            MESSAGES.SKIPPED_REPORT,
            request=self.request,
            user=self.request.user,
            source=report.project,
            related=report,
        )
    return redirect(report.project.get_absolute_url())

ReportUpdateView

Bases: UpdateView

form_class class-attribute instance-attribute

form_class = ReportEditForm

model class-attribute instance-attribute

model = Report

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def dispatch(self, *args, **kwargs):
    report = self.get_object()
    permission, _ = has_permission(
        "report_update", self.request.user, object=report, raise_exception=True
    )
    return super().dispatch(*args, **kwargs)

get_initial

get_initial()
Source code in hypha/apply/projects/views/report.py
def get_initial(self):
    if self.object.draft:
        current = self.object.draft
    else:
        current = self.object.current

    if current:
        return {
            "public_content": current.public_content,
            "private_content": current.private_content,
            "file_list": current.files.all(),
        }

    return {}

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/projects/views/report.py
def get_form_kwargs(self):
    return {
        "user": self.request.user,
        **super().get_form_kwargs(),
    }

get_success_url

get_success_url()
Source code in hypha/apply/projects/views/report.py
def get_success_url(self):
    return self.object.project.get_absolute_url()

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/report.py
def form_valid(self, form):
    response = super().form_valid(form)

    should_notify = True
    if self.object.draft:
        # It was a draft submission
        should_notify = False
    else:
        if self.object.submitted != self.object.current.submitted:
            # It was a staff edit - post submission
            should_notify = False

    if should_notify:
        messenger(
            MESSAGES.SUBMIT_REPORT,
            request=self.request,
            user=self.request.user,
            source=self.object.project,
            related=self.object,
        )

    # Required for django-file-form: delete temporary files for the new files
    # that are uploaded.
    form.delete_temporary_files()
    return response

CreateVendorView

Bases: CreateVendorAccessMixin, SessionWizardView

file_storage class-attribute instance-attribute

file_storage = PrivateStorage()

form_list class-attribute instance-attribute

form_list = [('basic', CreateVendorFormStep1), ('taxes', CreateVendorFormStep2), ('documents', CreateVendorFormStep3), ('bank', CreateVendorFormStep4), ('extra', CreateVendorFormStep5), ('other', CreateVendorFormStep6)]

condition_dict class-attribute instance-attribute

condition_dict = {'other': show_extra_info_form}

template_name class-attribute instance-attribute

template_name = 'application_projects/vendor_form.html'

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/vendor.py
def dispatch(self, request, *args, **kwargs):
    project_settings = ProjectSettings.for_request(request)
    if not project_settings.vendor_setup_required:
        raise PermissionDenied
    is_admin = request.user.is_apply_staff
    project = self.get_project()
    is_owner = request.user == project.user
    if not (is_owner or is_admin):
        raise PermissionDenied
    if not project.editable_by(request.user):
        raise PermissionDenied
    if not project.vendor:
        raise Http404
    return super().dispatch(request, *args, **kwargs)

get_project

get_project()
Source code in hypha/apply/projects/views/vendor.py
def get_project(self):
    return get_object_or_404(Project, pk=self.kwargs["pk"])

done

done(form_list, **kwargs)
Source code in hypha/apply/projects/views/vendor.py
def done(self, form_list, **kwargs):
    vendor_project = self.get_project()
    cleaned_data = self.get_all_cleaned_data()
    vendor = vendor_project.vendor
    need_extra_info = cleaned_data["need_extra_info"]
    bank_info = vendor.bank_info
    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"]
    if not bank_info:
        bank_info = BankInformation.objects.create(
            account_holder_name=account_holder_name,
            account_number=account_number,
            account_routing_number=account_routing_number,
            account_currency=account_currency,
            need_extra_info=need_extra_info,
        )
    else:
        bank_info.account_holder_name = account_holder_name
        bank_info.account_number = account_number
        bank_info.account_currency = account_currency
        bank_info.need_extra_info = need_extra_info
    if need_extra_info:
        ib_account_routing_number = cleaned_data["ib_account_routing_number"]
        ib_account_number = cleaned_data["ib_account_number"]
        ib_account_currency = cleaned_data["ib_account_currency"]
        ib_branch_address = cleaned_data["ib_branch_address"]
        iba_info = bank_info.iba_info
        if not iba_info:
            iba_info = BankInformation.objects.create(
                account_routing_number=ib_account_routing_number,
                account_number=ib_account_number,
                account_currency=ib_account_currency,
                branch_address=ib_branch_address,
            )
        else:
            iba_info.branch_address = ib_branch_address
            iba_info.account_routing_number = ib_account_routing_number
            iba_info.account_number = ib_account_number
            iba_info.account_currency = ib_account_currency
        iba_info.save()
        bank_info.branch_address = cleaned_data["branch_address"]
        bank_info.nid_type = cleaned_data["nid_type"]
        bank_info.nid_number = cleaned_data["nid_number"]
        bank_info.iba_info = iba_info
        vendor.other_info = cleaned_data["other_info"]

    bank_info.save()

    vendor.bank_info = bank_info
    vendor.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.updated_at = timezone.now()
    vendor.user_has_updated_details = True
    vendor.save()

    not_deleted_original_filenames = [
        file["name"]
        for file in json.loads(cleaned_data["due_diligence_documents-uploads"])
    ]
    for f in vendor.due_diligence_documents.all():
        if f.document.name not in not_deleted_original_filenames:
            f.document.delete()
            f.delete()

    for f in cleaned_data["due_diligence_documents"]:
        if not isinstance(f, FieldFile):
            try:
                DueDiligenceDocument.objects.create(vendor=vendor, document=f)
            finally:
                f.close()
    form = self.get_form("documents")
    form.delete_temporary_files()

    messenger(
        MESSAGES.UPDATED_VENDOR,
        request=self.request,
        user=vendor_project.lead,
        source=vendor_project,
    )

    return render(
        self.request,
        "application_projects/vendor_success.html",
        {"project": vendor_project},
    )

get_form_initial

get_form_initial(step)
Source code in hypha/apply/projects/views/vendor.py
def get_form_initial(self, step):
    vendor_project = self.get_project()
    vendor = vendor_project.vendor
    initial_dict = self.initial_dict.get(step, {})
    if vendor:
        initial_dict["basic"] = {
            "name": vendor.name,
            "contractor_name": vendor.contractor_name,
            "type": vendor.type,
        }
        initial_dict["taxes"] = {
            "required_to_pay_taxes": vendor.required_to_pay_taxes
        }
        initial_dict["documents"] = {
            "due_diligence_documents": [
                f.document for f in vendor.due_diligence_documents.all()
            ]
        }
        bank_info = vendor.bank_info
        if bank_info:
            initial_dict["bank"] = {
                "account_holder_name": bank_info.account_holder_name,
                "account_routing_number": bank_info.account_routing_number,
                "account_number": bank_info.account_number,
                "account_currency": bank_info.account_currency,
            }
            initial_dict["extra"] = {"need_extra_info": bank_info.need_extra_info}
            initial_dict["other"] = {
                "branch_address": bank_info.branch_address,
                "nid_type": bank_info.nid_type,
                "nid_number": bank_info.nid_number,
                "other_info": vendor.other_info,
            }
            iba_info = bank_info.iba_info
            if iba_info:
                initial_dict["other"]["ib_account_routing_number"] = (
                    iba_info.account_routing_number
                )
                initial_dict["other"]["ib_account_number"] = iba_info.account_number
                initial_dict["other"]["ib_account_currency"] = (
                    iba_info.account_currency
                )
                initial_dict["other"]["ib_branch_address"] = iba_info.branch_address
    return initial_dict.get(step, {})

get_form_kwargs

get_form_kwargs(step)
Source code in hypha/apply/projects/views/vendor.py
def get_form_kwargs(self, step):
    kwargs = super(CreateVendorView, self).get_form_kwargs(step)
    kwargs["site"] = Site.find_for_request(self.request)
    return kwargs

VendorDetailView

Bases: DetailVendorAccessMixin, DetailView

model class-attribute instance-attribute

model = Vendor

template_name class-attribute instance-attribute

template_name = 'application_projects/vendor_detail.html'

dispatch

dispatch(request, *args, **kwargs)
Source code in hypha/apply/projects/views/vendor.py
def dispatch(self, request, *args, **kwargs):
    project_settings = ProjectSettings.for_request(request)
    if not project_settings.vendor_setup_required:
        raise PermissionDenied
    is_admin = request.user.is_apply_staff
    project = self.get_project()
    is_owner = request.user == project.user
    if not (is_owner or is_admin):
        raise PermissionDenied
    if not project.vendor:
        raise Http404
    return super().dispatch(request, *args, **kwargs)

get_object

get_object(queryset=None)
Source code in hypha/apply/projects/views/vendor.py
def get_object(self, queryset=None):
    return get_object_or_404(self.model, id=self.kwargs["vendor_pk"])

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/projects/views/vendor.py
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["vendor_detailed_response"] = self.get_detailed_response()
    context["project"] = self.get_project()
    vendor = self.get_object()
    context["due_diligence_documents"] = vendor.due_diligence_documents.all()
    return context

get_project

get_project()
Source code in hypha/apply/projects/views/vendor.py
def get_project(self):
    return get_object_or_404(Project, pk=self.kwargs["pk"])

get_detailed_response

get_detailed_response()
Source code in hypha/apply/projects/views/vendor.py
def get_detailed_response(self):
    vendor = self.get_object()
    vendor_form_settings = VendorFormSettings.for_request(self.request)
    data = {}
    group = 0
    data.setdefault(
        group, {"title": str(_("Contracting Information")), "questions": []}
    )
    data[group]["questions"] = [
        (vendor_form_settings.name_label, vendor.name),
        (vendor_form_settings.contractor_name_label, vendor.contractor_name),
        (vendor_form_settings.type_label, vendor.type),
        (
            vendor_form_settings.required_to_pay_taxes_label,
            vendor.required_to_pay_taxes,
        ),
        (_("Due Diligence Documents"), ""),
    ]
    group = group + 1
    data.setdefault(
        group, {"title": str(_("Bank Account Information")), "questions": []}
    )
    bank_info = vendor.bank_info
    data[group]["questions"] = [
        (
            vendor_form_settings.account_holder_name_label,
            bank_info.account_holder_name if bank_info else "",
        ),
        (
            vendor_form_settings.account_routing_number_label,
            bank_info.account_routing_number if bank_info else "",
        ),
        (
            vendor_form_settings.account_number_label,
            bank_info.account_number if bank_info else "",
        ),
        (
            vendor_form_settings.account_currency_label,
            bank_info.account_currency if bank_info else "",
        ),
    ]
    group = group + 1
    data.setdefault(
        group,
        {
            "title": str(_("(Optional) Extra Information for Accepting Payments")),
            "questions": [],
        },
    )
    data[group]["questions"] = [
        (
            vendor_form_settings.branch_address_label,
            self.get_address_display(bank_info.branch_address) if bank_info else "",
        ),
    ]
    group = group + 1
    data.setdefault(
        group,
        {"title": str(_("Intermediary Bank Account Information")), "questions": []},
    )
    iba_info = bank_info.iba_info if bank_info else None
    data[group]["questions"] = [
        (
            vendor_form_settings.ib_account_routing_number_label,
            iba_info.account_routing_number if iba_info else "",
        ),
        (
            vendor_form_settings.ib_account_number_label,
            iba_info.account_number if iba_info else "",
        ),
        (
            vendor_form_settings.ib_account_currency_label,
            iba_info.account_currency if iba_info else "",
        ),
        (
            vendor_form_settings.ib_branch_address_label,
            self.get_address_display(iba_info.branch_address) if iba_info else "",
        ),
    ]
    group = group + 1
    data.setdefault(
        group,
        {
            "title": str(
                _("Account Holder National Identity Document Information")
            ),
            "questions": [],
        },
    )
    data[group]["questions"] = [
        (
            vendor_form_settings.nid_type_label,
            bank_info.nid_type if bank_info else "",
        ),
        (
            vendor_form_settings.nid_number_label,
            bank_info.nid_number if bank_info else "",
        ),
    ]
    group = group + 1
    data.setdefault(group, {"title": None, "questions": []})
    data[group]["questions"] = [
        (vendor_form_settings.other_info_label, vendor.other_info),
    ]
    return data

get_address_display

get_address_display(address)
Source code in hypha/apply/projects/views/vendor.py
def get_address_display(self, address):
    try:
        address = json.loads(address)
    except (json.JSONDecodeError, AttributeError):
        return ""
    else:
        return ", ".join(
            address.get(field)
            for field in ADDRESS_FIELDS_ORDER
            if address.get(field)
        )

VendorPrivateMediaView

Bases: UserPassesTestMixin, PrivateMediaView

storage class-attribute instance-attribute

storage = PrivateStorage()

raise_exception class-attribute instance-attribute

raise_exception = True

get

get(*args, **kwargs)
Source code in hypha/apply/utils/storage.py
def get(self, *args, **kwargs):
    file_to_serve = self.get_media(*args, **kwargs)
    return FileResponse(file_to_serve)

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/vendor.py
def dispatch(self, *args, **kwargs):
    pk = self.kwargs["pk"]
    vendor_pk = self.kwargs["vendor_pk"]
    self.vendor = get_object_or_404(Vendor, pk=vendor_pk)
    self.project = get_object_or_404(Project, pk=pk)

    return super().dispatch(*args, **kwargs)

get_media

get_media(*args, **kwargs)
Source code in hypha/apply/projects/views/vendor.py
def get_media(self, *args, **kwargs):
    file_pk = kwargs.get("file_pk")
    document = get_object_or_404(self.vendor.due_diligence_documents, pk=file_pk)
    return document.document

test_func

test_func()
Source code in hypha/apply/projects/views/vendor.py
def test_func(self):
    if self.request.user.is_apply_staff:
        return True

    if self.request.user == self.project.user:
        return True

    return False

get_invoices_status_counts

get_invoices_status_counts(request)
Source code in hypha/apply/projects/views/project_partials.py
@login_required
@require_GET
def get_invoices_status_counts(request):
    current_url = request.headers.get("Hx-Current-Url")
    current_url_queries = parse_qs(urlparse(current_url).query)
    invoice_status_url_query = current_url_queries.get("status")
    invoices_status_counts = dict(
        Invoice.objects.all()
        .values("status")
        .annotate(
            count=Count("status"),
        )
        .values_list(
            "status",
            "count",
        )
    )
    status_counts = {
        name: {
            "name": name,
            "count": sum(invoices_status_counts.get(status, 0) for status in statuses),
            "url": reverse_lazy("funds:projects:invoices")
            + get_statuses_as_params(statuses),
            "is_active": True
            if invoice_status_url_query and statuses == invoice_status_url_query
            else False,
        }
        for name, statuses in statuses_and_table_statuses_mapping.items()
    }
    return render(
        request,
        "funds/includes/status-block.html",
        {
            "status_counts": status_counts,
            "type": _("Invoices"),
        },
    )

get_project_status_counts

get_project_status_counts(request)
Source code in hypha/apply/projects/views/project_partials.py
@login_required
@require_GET
def get_project_status_counts(request):
    current_url = request.headers.get("Hx-Current-Url")
    current_url_queries = parse_qs(urlparse(current_url).query)
    project_status_url_query = current_url_queries.get("project_status")
    project_status_counts = dict(
        Project.objects.all()
        .values("status")
        .annotate(
            count=Count("status"),
        )
        .values_list(
            "status",
            "count",
        )
    )
    status_counts = {
        key: {
            "name": display.replace(" and ", " & "),
            "count": project_status_counts.get(key, 0),
            "url": reverse_lazy("funds:projects:all") + "?project_status=" + key,
            "is_active": True
            if project_status_url_query and key in project_status_url_query
            else False,
        }
        for key, display in PROJECT_STATUS_CHOICES
    }

    return render(
        request,
        "funds/includes/status-block.html",
        {
            "status_counts": status_counts,
            "type": _("Projects"),
        },
    )

partial_project_activities

partial_project_activities(request, pk)
Source code in hypha/apply/projects/views/project_partials.py
@login_required
@require_GET
def partial_project_activities(request, pk):
    project = get_object_or_404(Project, pk=pk)
    has_permission("project_access", request.user, object=project, raise_exception=True)
    ctx = {"actions": get_related_actions_for_user(project, request.user)}
    return render(request, "activity/include/action_list.html", ctx)