mirror of https://github.com/zulip/zulip.git
183 lines
6.5 KiB
Python
183 lines
6.5 KiB
Python
from typing import Optional
|
|
from urllib.parse import urlencode
|
|
|
|
import orjson
|
|
from django.conf import settings
|
|
from django.contrib.auth.views import redirect_to_login
|
|
from django.http import HttpRequest, HttpResponse, HttpResponseRedirect
|
|
from django.template.response import TemplateResponse
|
|
|
|
from corporate.lib.stripe import is_realm_on_free_trial
|
|
from corporate.models import get_customer_by_realm
|
|
from zerver.context_processors import get_realm_from_request, latest_info_context
|
|
from zerver.decorator import add_google_analytics
|
|
from zerver.lib.github import (
|
|
InvalidPlatformError,
|
|
get_latest_github_release_download_link_for_platform,
|
|
)
|
|
from zerver.lib.realm_description import get_realm_text_description
|
|
from zerver.lib.realm_icon import get_realm_icon_url
|
|
from zerver.lib.subdomains import is_subdomain_root_or_alias
|
|
from zerver.models import Realm
|
|
|
|
|
|
@add_google_analytics
|
|
def apps_view(request: HttpRequest, platform: Optional[str] = None) -> HttpResponse:
|
|
if not settings.CORPORATE_ENABLED:
|
|
# This seems impossible (CORPORATE_ENABLED set to false when
|
|
# rendering a "corporate" view) -- but we add it to make
|
|
# testing possible. Tests default to running with the
|
|
# "corporate" app installed, and unsetting that is difficult,
|
|
# as one cannot easily reload the URL resolution -- so we add
|
|
# a redirect here, equivalent to the one zerver would have
|
|
# installed when "corporate" is not enabled, to make the
|
|
# behaviour testable with CORPORATE_ENABLED set to false.
|
|
return HttpResponseRedirect("https://zulip.com/apps/", status=301)
|
|
return TemplateResponse(
|
|
request,
|
|
"corporate/apps.html",
|
|
)
|
|
|
|
|
|
def app_download_link_redirect(request: HttpRequest, platform: str) -> HttpResponse:
|
|
try:
|
|
download_link = get_latest_github_release_download_link_for_platform(platform)
|
|
return HttpResponseRedirect(download_link, status=302)
|
|
except InvalidPlatformError:
|
|
return TemplateResponse(request, "404.html", status=404)
|
|
|
|
|
|
@add_google_analytics
|
|
def plans_view(request: HttpRequest) -> HttpResponse:
|
|
realm = get_realm_from_request(request)
|
|
free_trial_days = settings.FREE_TRIAL_DAYS
|
|
sponsorship_pending = False
|
|
sponsorship_url = "/sponsorship/"
|
|
if is_subdomain_root_or_alias(request):
|
|
# If we're on the root domain, we make this link first ask you which organization.
|
|
sponsorship_url = f"/accounts/go/?{urlencode({'next': sponsorship_url})}"
|
|
realm_on_free_trial = False
|
|
|
|
if realm is not None:
|
|
if realm.plan_type == Realm.PLAN_TYPE_SELF_HOSTED and settings.PRODUCTION:
|
|
return HttpResponseRedirect("https://zulip.com/plans/")
|
|
if not request.user.is_authenticated:
|
|
return redirect_to_login(next="/plans/")
|
|
if request.user.is_guest:
|
|
return TemplateResponse(request, "404.html", status=404)
|
|
customer = get_customer_by_realm(realm)
|
|
if customer is not None:
|
|
sponsorship_pending = customer.sponsorship_pending
|
|
realm_on_free_trial = is_realm_on_free_trial(realm)
|
|
|
|
return TemplateResponse(
|
|
request,
|
|
"corporate/plans.html",
|
|
context={
|
|
"realm": realm,
|
|
"free_trial_days": free_trial_days,
|
|
"realm_on_free_trial": realm_on_free_trial,
|
|
"sponsorship_pending": sponsorship_pending,
|
|
"sponsorship_url": sponsorship_url,
|
|
},
|
|
)
|
|
|
|
|
|
@add_google_analytics
|
|
def team_view(request: HttpRequest) -> HttpResponse:
|
|
if not settings.ZILENCER_ENABLED:
|
|
return HttpResponseRedirect("https://zulip.com/team/", status=301)
|
|
|
|
try:
|
|
with open(settings.CONTRIBUTOR_DATA_FILE_PATH, "rb") as f:
|
|
data = orjson.loads(f.read())
|
|
except FileNotFoundError:
|
|
data = {"contributors": [], "date": "Never ran."}
|
|
|
|
return TemplateResponse(
|
|
request,
|
|
"corporate/team.html",
|
|
context={
|
|
"page_params": {
|
|
"contributors": data["contributors"],
|
|
},
|
|
"date": data["date"],
|
|
},
|
|
)
|
|
|
|
|
|
@add_google_analytics
|
|
def landing_view(request: HttpRequest, template_name: str) -> HttpResponse:
|
|
return TemplateResponse(request, template_name, latest_info_context())
|
|
|
|
|
|
@add_google_analytics
|
|
def hello_view(request: HttpRequest) -> HttpResponse:
|
|
return TemplateResponse(request, "corporate/hello.html", latest_info_context())
|
|
|
|
|
|
@add_google_analytics
|
|
def communities_view(request: HttpRequest) -> HttpResponse:
|
|
eligible_realms = []
|
|
unique_org_type_ids = set()
|
|
want_to_be_advertised_realms = (
|
|
Realm.objects.filter(
|
|
want_advertise_in_communities_directory=True,
|
|
)
|
|
.exclude(
|
|
# Filter out realms who haven't changed their description from the default.
|
|
description="",
|
|
)
|
|
.order_by("name")
|
|
)
|
|
for realm in want_to_be_advertised_realms:
|
|
open_to_public = not realm.invite_required and not realm.emails_restricted_to_domains
|
|
if realm.allow_web_public_streams_access() or open_to_public:
|
|
[org_type] = (
|
|
org_type
|
|
for org_type in Realm.ORG_TYPES
|
|
if Realm.ORG_TYPES[org_type]["id"] == realm.org_type
|
|
)
|
|
eligible_realms.append(
|
|
{
|
|
"id": realm.id,
|
|
"name": realm.name,
|
|
"realm_url": realm.uri,
|
|
"logo_url": get_realm_icon_url(realm),
|
|
"description": get_realm_text_description(realm),
|
|
"org_type_key": org_type,
|
|
}
|
|
)
|
|
unique_org_type_ids.add(realm.org_type)
|
|
|
|
# Custom list of org filters to show.
|
|
CATEGORIES_TO_OFFER = [
|
|
"opensource",
|
|
"research",
|
|
"community",
|
|
]
|
|
|
|
# Remove org_types for which there are no open organizations.
|
|
org_types = dict()
|
|
for org_type in CATEGORIES_TO_OFFER:
|
|
if Realm.ORG_TYPES[org_type]["id"] in unique_org_type_ids:
|
|
org_types[org_type] = Realm.ORG_TYPES[org_type]
|
|
|
|
# This code is not required right bot could be useful in future.
|
|
# If we ever decided to show all the ORG_TYPES.
|
|
# Remove `Unspecified` ORG_TYPE
|
|
# org_types.pop("unspecified", None)
|
|
|
|
# Change display name of non-profit orgs.
|
|
# if org_types.get("nonprofit"): # nocoverage
|
|
# org_types["nonprofit"]["name"] = "Non-profit"
|
|
|
|
return TemplateResponse(
|
|
request,
|
|
"corporate/communities.html",
|
|
context={
|
|
"eligible_realms": eligible_realms,
|
|
"org_types": org_types,
|
|
},
|
|
)
|