diff --git a/corporate/urls.py b/corporate/urls.py index 4c291f7898..398d47c0d0 100644 --- a/corporate/urls.py +++ b/corporate/urls.py @@ -70,7 +70,13 @@ from corporate.views.sponsorship import ( sponsorship, sponsorship_page, ) -from corporate.views.support import demo_request, remote_servers_support, support, support_request +from corporate.views.support import ( + demo_request, + remote_servers_support, + sales_support_request, + support, + support_request, +) from corporate.views.upgrade import ( remote_realm_upgrade, remote_realm_upgrade_page, @@ -97,6 +103,7 @@ i18n_urlpatterns: Any = [ path("upgrade/", upgrade_page, name="upgrade_page"), path("support/", support_request), path("request-demo/", demo_request), + path("contact-sales/", sales_support_request), path("billing/event_status/", event_status_page, name="event_status_page"), path("stripe/webhook/", stripe_webhook, name="stripe_webhook"), # Server admin (user_profile.is_staff) visible stats pages diff --git a/corporate/views/support.py b/corporate/views/support.py index 2b2338bafe..4b4fa726fa 100644 --- a/corporate/views/support.py +++ b/corporate/views/support.py @@ -22,7 +22,11 @@ from pydantic import AfterValidator, Json, NonNegativeInt from confirmation.models import Confirmation, confirmation_url from confirmation.settings import STATUS_USED -from corporate.lib.activity import format_optional_datetime, remote_installation_stats_link +from corporate.lib.activity import ( + format_optional_datetime, + realm_support_link, + remote_installation_stats_link, +) from corporate.lib.billing_types import BillingModality from corporate.models import CustomerPlan from zerver.actions.create_realm import do_change_realm_subdomain @@ -95,6 +99,13 @@ class DemoRequestForm(forms.Form): message = forms.CharField(widget=forms.Textarea) +class SalesRequestForm(forms.Form): + MAX_INPUT_LENGTH = 50 + organization_website = forms.URLField(required=True, assume_scheme="https") + expected_user_count = forms.CharField(max_length=MAX_INPUT_LENGTH) + message = forms.CharField(widget=forms.Textarea) + + @zulip_login_required @typed_endpoint_without_parameters def support_request(request: HttpRequest) -> HttpResponse: @@ -186,6 +197,59 @@ def demo_request(request: HttpRequest) -> HttpResponse: return response +@zulip_login_required +@typed_endpoint_without_parameters +def sales_support_request(request: HttpRequest) -> HttpResponse: + from corporate.lib.stripe import BILLING_SUPPORT_EMAIL + + assert request.user.is_authenticated + + if not request.user.is_realm_admin: + return render(request, "404.html", status=404) + + context = { + "MAX_INPUT_LENGTH": SalesRequestForm.MAX_INPUT_LENGTH, + "user_email": request.user.delivery_email, + "user_full_name": request.user.full_name, + } + + if request.POST: + post_data = request.POST.copy() + form = SalesRequestForm(post_data) + + if form.is_valid(): + rate_limit_request_by_ip(request, domain="sends_email_by_ip") + + email_context = { + "full_name": request.user.full_name, + "email": request.user.delivery_email, + "role": UserProfile.ROLE_ID_TO_API_NAME[request.user.role], + "organization_name": request.user.realm.name, + "organization_type": get_org_type_display_name(request.user.realm.org_type), + "organization_website": form.cleaned_data["organization_website"], + "expected_user_count": form.cleaned_data["expected_user_count"], + "message": form.cleaned_data["message"], + "support_link": realm_support_link(request.user.realm.string_id), + } + + send_email( + "zerver/emails/sales_support_request", + to_emails=[BILLING_SUPPORT_EMAIL], + from_name="Sales support request", + from_address=FromAddress.tokenized_no_reply_address(), + reply_to_email=email_context["email"], + context=email_context, + ) + + response = render( + request, "corporate/support/support_request_thanks.html", context=context + ) + return response + + response = render(request, "corporate/support/sales_support_request.html", context=context) + return response + + def get_plan_type_string(plan_type: int) -> str: return { Realm.PLAN_TYPE_SELF_HOSTED: "Self-hosted", diff --git a/templates/corporate/support/sales_support_request.html b/templates/corporate/support/sales_support_request.html new file mode 100644 index 0000000000..b85785d9c4 --- /dev/null +++ b/templates/corporate/support/sales_support_request.html @@ -0,0 +1,51 @@ +{% extends "zerver/portico_signup.html" %} + +{% set PAGE_TITLE = "Contact sales | Zulip" %} + +{% block portico_content %} +