def form_valid()

in community/front-end/ofe/website/ghpcfe/views/jobs.py [0:0]


    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user

        # Can't trust client side input for these... (bad user, no cookie)
        # self.object.node_price = self.request.POST.get('node_price')
        # self.object.job_cost = self.request.POST.get('job_cost')
        cluster = self.object.cluster
        instance_type = self.object.partition.machine_type

        try:
            node_price_float = cloud_info.get_instance_pricing(
                "GCP",
                cluster.cloud_credential.detail,
                cluster.cloud_region,
                cluster.cloud_zone,
                instance_type,
            )
            self.object.node_price = Decimal(node_price_float)
            logger.debug(
                "Got api price %0.2f for %s in %s-%s",
                self.object.node_price,
                instance_type,
                cluster.cloud_region,
                cluster.cloud_zone,
            )

        # No sense in second guessing the possible error states, if the API call
        # fails just pass the error along regardless of how we failed
        except Exception as err:  # pylint: disable=broad-except
            form.add_error(
                None,
                f"Error: Pricing API unavailable - please retry later ({err})",
            )
            return self.form_invalid(form)

        self.object.job_cost = (
            self.object.node_price
            * self.object.number_of_nodes
            * self.object.wall_clock_time_limit
            / Decimal(60)
        )

        if self.object.user.quota_type == "d":
            form.add_error(
                None, "Error: Cannot submit job. User quota disabled"
            )
            return self.form_invalid(form)
        if self.object.user.quota_type == "l":
            quota_remaining = (
                self.object.user.quota_amount - self.object.user.total_spend()
            )
            # Fudge to nearest cent to avoid "apparently equal" issues in user
            # display
            if self.object.job_cost > (quota_remaining - Decimal(0.005)):
                form.add_error(
                    None,
                    "Error: Insufficient quota remaining (have "
                    f"${quota_remaining:0.2f}, job would require "
                    f"${self.object.job_cost:0.2f})",
                )
                return self.form_invalid(form)

        self.object.save()
        return HttpResponseRedirect(self.get_success_url())