From 7b8a3d2e95971a4b04f93ed46e9a071e44e89319 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Wed, 6 Dec 2023 22:34:36 +0530 Subject: [PATCH] dev: update instance configuration function --- apiserver/plane/app/views/auth_extended.py | 39 ++-- apiserver/plane/app/views/authentication.py | 39 ++-- apiserver/plane/app/views/config.py | 203 ++++++++++++------ apiserver/plane/app/views/external.py | 43 ++-- apiserver/plane/app/views/oauth.py | 43 ++-- .../plane/bgtasks/analytic_plot_export.py | 8 +- .../plane/bgtasks/forgot_password_task.py | 10 +- .../plane/bgtasks/magic_link_code_task.py | 7 +- .../plane/bgtasks/project_invitation_task.py | 4 +- .../bgtasks/workspace_invitation_task.py | 9 +- .../plane/license/utils/instance_value.py | 151 ++++++++----- apiserver/plane/settings/common.py | 3 + 12 files changed, 327 insertions(+), 232 deletions(-) diff --git a/apiserver/plane/app/views/auth_extended.py b/apiserver/plane/app/views/auth_extended.py index b169fde65..660829f4b 100644 --- a/apiserver/plane/app/views/auth_extended.py +++ b/apiserver/plane/app/views/auth_extended.py @@ -34,7 +34,7 @@ from plane.app.serializers import ( from plane.db.models import User, WorkspaceMemberInvite from plane.license.utils.instance_value import get_configuration_value from plane.bgtasks.forgot_password_task import forgot_password -from plane.license.models import Instance, InstanceConfiguration +from plane.license.models import Instance from plane.settings.redis import redis_instance from plane.bgtasks.magic_link_code_task import magic_link from plane.bgtasks.event_tracking_task import auth_events @@ -321,8 +321,19 @@ class EmailCheckEndpoint(BaseAPIView): status=status.HTTP_400_BAD_REQUEST, ) - # Get the configurations - instance_configuration = InstanceConfiguration.objects.values("key", "value") + # Get configuration values + ENABLE_SIGNUP, ENABLE_MAGIC_LINK_LOGIN = get_configuration_value( + [ + { + "key": "ENABLE_SIGNUP", + "default": os.environ.get("ENABLE_SIGNUP"), + }, + { + "key": "ENABLE_MAGIC_LINK_LOGIN", + "default": os.environ.get("ENABLE_MAGIC_LINK_LOGIN"), + }, + ] + ) email = request.data.get("email", False) @@ -347,12 +358,7 @@ class EmailCheckEndpoint(BaseAPIView): if user is None: # Create the user if ( - get_configuration_value( - instance_configuration, - "ENABLE_SIGNUP", - os.environ.get("ENABLE_SIGNUP", "0"), - ) - == "0" + ENABLE_SIGNUP == "0" and not WorkspaceMemberInvite.objects.filter( email=email, ).exists() @@ -372,13 +378,8 @@ class EmailCheckEndpoint(BaseAPIView): is_password_autoset=True, ) - if not bool( - get_configuration_value( - instance_configuration, - "ENABLE_MAGIC_LINK_LOGIN", - os.environ.get("ENABLE_MAGIC_LINK_LOGIN"), - ), + ENABLE_MAGIC_LINK_LOGIN, ): return Response( {"error": "Magic link sign in is disabled."}, @@ -413,13 +414,7 @@ class EmailCheckEndpoint(BaseAPIView): else: if user.is_password_autoset: ## Generate a random token - if not bool( - get_configuration_value( - instance_configuration, - "ENABLE_MAGIC_LINK_LOGIN", - os.environ.get("ENABLE_MAGIC_LINK_LOGIN"), - ), - ): + if not bool(ENABLE_MAGIC_LINK_LOGIN): return Response( {"error": "Magic link sign in is disabled."}, status=status.HTTP_400_BAD_REQUEST, diff --git a/apiserver/plane/app/views/authentication.py b/apiserver/plane/app/views/authentication.py index 32b8a34f4..2a94b5f1f 100644 --- a/apiserver/plane/app/views/authentication.py +++ b/apiserver/plane/app/views/authentication.py @@ -27,7 +27,7 @@ from plane.db.models import ( ProjectMember, ) from plane.settings.redis import redis_instance -from plane.license.models import InstanceConfiguration, Instance +from plane.license.models import Instance from plane.license.utils.instance_value import get_configuration_value from plane.bgtasks.event_tracking_task import auth_events @@ -52,8 +52,6 @@ class SignUpEndpoint(BaseAPIView): status=status.HTTP_400_BAD_REQUEST, ) - instance_configuration = InstanceConfiguration.objects.values("key", "value") - email = request.data.get("email", False) password = request.data.get("password", False) ## Raise exception if any of the above are missing @@ -73,14 +71,20 @@ class SignUpEndpoint(BaseAPIView): status=status.HTTP_400_BAD_REQUEST, ) + # get configuration values + # Get configuration values + ENABLE_SIGNUP = get_configuration_value( + [ + { + "key": "ENABLE_SIGNUP", + "default": os.environ.get("ENABLE_SIGNUP"), + }, + ] + ) + # If the sign up is not enabled and the user does not have invite disallow him from creating the account if ( - get_configuration_value( - instance_configuration, - "ENABLE_SIGNUP", - os.environ.get("ENABLE_SIGNUP", "0"), - ) - == "0" + ENABLE_SIGNUP == "0" and not WorkspaceMemberInvite.objects.filter( email=email, ).exists() @@ -169,16 +173,17 @@ class SignInEndpoint(BaseAPIView): # Create the user else: - # Get the configurations - instance_configuration = InstanceConfiguration.objects.values("key", "value") + ENABLE_SIGNUP = get_configuration_value( + [ + { + "key": "ENABLE_SIGNUP", + "default": os.environ.get("ENABLE_SIGNUP"), + }, + ] + ) # Create the user if ( - get_configuration_value( - instance_configuration, - "ENABLE_SIGNUP", - os.environ.get("ENABLE_SIGNUP", "0"), - ) - == "0" + ENABLE_SIGNUP == "0" and not WorkspaceMemberInvite.objects.filter( email=email, ).exists() diff --git a/apiserver/plane/app/views/config.py b/apiserver/plane/app/views/config.py index cef68d6d0..9ed82a573 100644 --- a/apiserver/plane/app/views/config.py +++ b/apiserver/plane/app/views/config.py @@ -11,7 +11,6 @@ from rest_framework.response import Response # Module imports from .base import BaseAPIView -from plane.license.models import InstanceConfiguration from plane.license.utils.instance_value import get_configuration_value @@ -21,89 +20,155 @@ class ConfigurationEndpoint(BaseAPIView): ] def get(self, request): - instance_configuration = InstanceConfiguration.objects.values("key", "value") + print( + get_configuration_value( + [ + { + "key": "GOOGLE_CLIENT_ID", + "default": os.environ.get("GOOGLE_CLIENT_ID", None), + }, + { + "key": "GITHUB_CLIENT_ID", + "default": os.environ.get("GITHUB_CLIENT_ID", None), + }, + { + "key": "GITHUB_APP_NAME", + "default": os.environ.get("GITHUB_APP_NAME", None), + }, + { + "key": "EMAIL_HOST_USER", + "default": os.environ.get("EMAIL_HOST_USER", None), + }, + { + "key": "EMAIL_HOST_PASSWORD", + "default": os.environ.get("EMAIL_HOST_PASSWORD", None), + }, + { + "key": "ENABLE_MAGIC_LINK_LOGIN", + "default": os.environ.get("ENABLE_MAGIC_LINK_LOGIN", "1"), + }, + { + "key": "ENABLE_EMAIL_PASSWORD", + "default": os.environ.get("ENABLE_EMAIL_PASSWORD", "1"), + }, + { + "key": "SLACK_CLIENT_ID", + "default": os.environ.get("SLACK_CLIENT_ID", "1"), + }, + { + "key": "POSTHOG_API_KEY", + "default": os.environ.get("POSTHOG_API_KEY", "1"), + }, + { + "key": "POSTHOG_HOST", + "default": os.environ.get("POSTHOG_HOST", "1"), + }, + { + "key": "UNSPLASH_ACCESS_KEY", + "default": os.environ.get("UNSPLASH_ACCESS_KEY", "1"), + }, + { + "key": "OPENAI_API_KEY", + "default": os.environ.get("OPENAI_API_KEY", "1"), + }, + ] + ) + ) + # Get all the configuration + ( + GOOGLE_CLIENT_ID, + GITHUB_CLIENT_ID, + GITHUB_APP_NAME, + EMAIL_HOST_USER, + EMAIL_HOST_PASSWORD, + ENABLE_MAGIC_LINK_LOGIN, + ENABLE_EMAIL_PASSWORD, + SLACK_CLIENT_ID, + POSTHOG_API_KEY, + POSTHOG_HOST, + UNSPLASH_ACCESS_KEY, + OPENAI_API_KEY, + ) = get_configuration_value( + [ + { + "key": "GOOGLE_CLIENT_ID", + "default": os.environ.get("GOOGLE_CLIENT_ID", None), + }, + { + "key": "GITHUB_CLIENT_ID", + "default": os.environ.get("GITHUB_CLIENT_ID", None), + }, + { + "key": "GITHUB_APP_NAME", + "default": os.environ.get("GITHUB_APP_NAME", None), + }, + { + "key": "EMAIL_HOST_USER", + "default": os.environ.get("EMAIL_HOST_USER", None), + }, + { + "key": "EMAIL_HOST_PASSWORD", + "default": os.environ.get("EMAIL_HOST_PASSWORD", None), + }, + { + "key": "ENABLE_MAGIC_LINK_LOGIN", + "default": os.environ.get("ENABLE_MAGIC_LINK_LOGIN", "1"), + }, + { + "key": "ENABLE_EMAIL_PASSWORD", + "default": os.environ.get("ENABLE_EMAIL_PASSWORD", "1"), + }, + { + "key": "SLACK_CLIENT_ID", + "default": os.environ.get("SLACK_CLIENT_ID", "1"), + }, + { + "key": "POSTHOG_API_KEY", + "default": os.environ.get("POSTHOG_API_KEY", "1"), + }, + { + "key": "POSTHOG_HOST", + "default": os.environ.get("POSTHOG_HOST", "1"), + }, + { + "key": "UNSPLASH_ACCESS_KEY", + "default": os.environ.get("UNSPLASH_ACCESS_KEY", "1"), + }, + { + "key": "OPENAI_API_KEY", + "default": os.environ.get("OPENAI_API_KEY", "1"), + }, + ] + ) + print("hewllo") data = {} # Authentication - data["google_client_id"] = get_configuration_value( - instance_configuration, - "GOOGLE_CLIENT_ID", - os.environ.get("GOOGLE_CLIENT_ID", None), - ) - data["github_client_id"] = get_configuration_value( - instance_configuration, - "GITHUB_CLIENT_ID", - os.environ.get("GITHUB_CLIENT_ID", None), - ) - data["github_app_name"] = get_configuration_value( - instance_configuration, - "GITHUB_APP_NAME", - os.environ.get("GITHUB_APP_NAME", None), - ) + data["google_client_id"] = GOOGLE_CLIENT_ID + data["github_client_id"] = GITHUB_CLIENT_ID + data["github_app_name"] = GITHUB_APP_NAME data["magic_login"] = ( - bool( - get_configuration_value( - instance_configuration, - "EMAIL_HOST_USER", - os.environ.get("EMAIL_HOST_USER", None), - ), - ) - and bool( - get_configuration_value( - instance_configuration, - "EMAIL_HOST_PASSWORD", - os.environ.get("EMAIL_HOST_PASSWORD", None), - ) - ) - ) and get_configuration_value( - instance_configuration, "ENABLE_MAGIC_LINK_LOGIN", "1" - ) == "1" + bool(EMAIL_HOST_USER) and bool(EMAIL_HOST_PASSWORD) + ) and ENABLE_MAGIC_LINK_LOGIN == "1" - data["email_password_login"] = ( - get_configuration_value( - instance_configuration, "ENABLE_EMAIL_PASSWORD", "1" - ) - == "1" - ) + data["email_password_login"] = ENABLE_EMAIL_PASSWORD == "1" # Slack client - data["slack_client_id"] = get_configuration_value( - instance_configuration, - "SLACK_CLIENT_ID", - os.environ.get("SLACK_CLIENT_ID", None), - ) + data["slack_client_id"] = SLACK_CLIENT_ID # Posthog - data["posthog_api_key"] = get_configuration_value( - instance_configuration, - "POSTHOG_API_KEY", - os.environ.get("POSTHOG_API_KEY", None), - ) - data["posthog_host"] = get_configuration_value( - instance_configuration, - "POSTHOG_HOST", - os.environ.get("POSTHOG_HOST", None), - ) + data["posthog_api_key"] = POSTHOG_API_KEY + data["posthog_host"] = POSTHOG_HOST # Unsplash - data["has_unsplash_configured"] = bool( - get_configuration_value( - instance_configuration, - "UNSPLASH_ACCESS_KEY", - os.environ.get("UNSPLASH_ACCESS_KEY", None), - ) - ) + data["has_unsplash_configured"] = UNSPLASH_ACCESS_KEY # Open AI settings - data["has_openai_configured"] = bool( - get_configuration_value( - instance_configuration, - "OPENAI_API_KEY", - os.environ.get("OPENAI_API_KEY", None), - ) - ) + data["has_openai_configured"] = bool(OPENAI_API_KEY) + # File size settings data["file_size_limit"] = float(os.environ.get("FILE_SIZE_LIMIT", 5242880)) + # is self managed data["is_self_managed"] = bool(int(os.environ.get("IS_SELF_MANAGED", "1"))) return Response(data, status=status.HTTP_200_OK) diff --git a/apiserver/plane/app/views/external.py b/apiserver/plane/app/views/external.py index b9f8a0cf0..448234fc1 100644 --- a/apiserver/plane/app/views/external.py +++ b/apiserver/plane/app/views/external.py @@ -1,6 +1,7 @@ # Python imports import requests import os + # Third party imports from openai import OpenAI from rest_framework.response import Response @@ -15,23 +16,31 @@ from plane.app.permissions import ProjectEntityPermission from plane.db.models import Workspace, Project from plane.app.serializers import ProjectLiteSerializer, WorkspaceLiteSerializer from plane.utils.integrations.github import get_release_notes -from plane.license.models import InstanceConfiguration from plane.license.utils.instance_value import get_configuration_value + class GPTIntegrationEndpoint(BaseAPIView): permission_classes = [ ProjectEntityPermission, ] def post(self, request, slug, project_id): + OPENAI_API_KEY, GPT_ENGINE = get_configuration_value( + [ + { + "key": "OPENAI_API_KEY", + "default": os.environ.get("OPENAI_API_KEY", None), + }, + { + "key": "GPT_ENGINE", + "default": os.environ.get("GPT_ENGINE", "gpt-3.5-turbo"), + }, + ] + ) # Get the configuration value - instance_configuration = InstanceConfiguration.objects.values("key", "value") - api_key = get_configuration_value(instance_configuration, "OPENAI_API_KEY", os.environ.get("OPENAI_API_KEY")) - gpt_engine = get_configuration_value(instance_configuration, "GPT_ENGINE", os.environ.get("GPT_ENGINE", "gpt-3.5-turbo")) - # Check the keys - if not api_key or not gpt_engine: + if not OPENAI_API_KEY or not GPT_ENGINE: return Response( {"error": "OpenAI API key and engine is required"}, status=status.HTTP_400_BAD_REQUEST, @@ -48,11 +57,11 @@ class GPTIntegrationEndpoint(BaseAPIView): final_text = task + "\n" + prompt client = OpenAI( - api_key=api_key, + api_key=OPENAI_API_KEY, ) response = client.chat.completions.create( - model=gpt_engine, + model=GPT_ENGINE, messages=[{"role": "user", "content": final_text}], ) @@ -79,13 +88,17 @@ class ReleaseNotesEndpoint(BaseAPIView): class UnsplashEndpoint(BaseAPIView): - def get(self, request): - instance_configuration = InstanceConfiguration.objects.values("key", "value") - unsplash_access_key = get_configuration_value(instance_configuration, "UNSPLASH_ACCESS_KEY", os.environ.get("UNSPLASH_ACCESS_KEY")) - + UNSPLASH_ACESS_KEY = get_configuration_value( + [ + { + "key": "UNSPLASH_ACESS_KEY", + "default": os.environ.get("UNSPLASH_ACCESS_KEY"), + } + ] + ) # Check unsplash access key - if not unsplash_access_key: + if not UNSPLASH_ACESS_KEY: return Response([], status=status.HTTP_200_OK) # Query parameters @@ -94,9 +107,9 @@ class UnsplashEndpoint(BaseAPIView): per_page = request.GET.get("per_page", 20) url = ( - f"https://api.unsplash.com/search/photos/?client_id={unsplash_access_key}&query={query}&page=${page}&per_page={per_page}" + f"https://api.unsplash.com/search/photos/?client_id={UNSPLASH_ACESS_KEY}&query={query}&page=${page}&per_page={per_page}" if query - else f"https://api.unsplash.com/photos/?client_id={unsplash_access_key}&page={page}&per_page={per_page}" + else f"https://api.unsplash.com/photos/?client_id={UNSPLASH_ACESS_KEY}&page={page}&per_page={per_page}" ) headers = { diff --git a/apiserver/plane/app/views/oauth.py b/apiserver/plane/app/views/oauth.py index 85e6ac957..0ffb76db2 100644 --- a/apiserver/plane/app/views/oauth.py +++ b/apiserver/plane/app/views/oauth.py @@ -30,7 +30,7 @@ from plane.db.models import ( ) from plane.bgtasks.event_tracking_task import auth_events from .base import BaseAPIView -from plane.license.models import InstanceConfiguration, Instance +from plane.license.models import Instance from plane.license.utils.instance_value import get_configuration_value @@ -147,18 +147,20 @@ class OauthEndpoint(BaseAPIView): id_token = request.data.get("credential", False) client_id = request.data.get("clientId", False) - instance_configuration = InstanceConfiguration.objects.values( - "key", "value" + GOOGLE_CLIENT_ID, GITHUB_CLIENT_ID = get_configuration_value( + [ + { + "key": "GOOGLE_CLIENT_ID", + "default": os.environ.get("GOOGLE_CLIENT_ID"), + }, + { + "key": "GITHUB_CLIENT_ID", + "default": os.environ.get("GITHUB_CLIENT_ID"), + }, + ] ) - if not get_configuration_value( - instance_configuration, - "GOOGLE_CLIENT_ID", - os.environ.get("GOOGLE_CLIENT_ID"), - ) or not get_configuration_value( - instance_configuration, - "GITHUB_CLIENT_ID", - os.environ.get("GITHUB_CLIENT_ID"), - ): + + if not GOOGLE_CLIENT_ID or not GITHUB_CLIENT_ID: return Response( {"error": "Github or Google login is not configured"}, status=status.HTTP_400_BAD_REQUEST, @@ -298,17 +300,16 @@ class OauthEndpoint(BaseAPIView): return Response(data, status=status.HTTP_200_OK) except User.DoesNotExist: - ## Signup Case - instance_configuration = InstanceConfiguration.objects.values( - "key", "value" + ENABLE_SIGNUP = get_configuration_value( + [ + { + "key": "ENABLE_SIGNUP", + "default": os.environ.get("ENABLE_SIGNUP", "0"), + } + ] ) if ( - get_configuration_value( - instance_configuration, - "ENABLE_SIGNUP", - os.environ.get("ENABLE_SIGNUP", "0"), - ) - == "0" + ENABLE_SIGNUP == "0" and not WorkspaceMemberInvite.objects.filter( email=email, ).exists() diff --git a/apiserver/plane/bgtasks/analytic_plot_export.py b/apiserver/plane/bgtasks/analytic_plot_export.py index 5d4f58eba..4aa86f6ca 100644 --- a/apiserver/plane/bgtasks/analytic_plot_export.py +++ b/apiserver/plane/bgtasks/analytic_plot_export.py @@ -18,7 +18,6 @@ from sentry_sdk import capture_exception from plane.db.models import Issue from plane.utils.analytics_plot import build_graph_plot from plane.utils.issue_filters import issue_filters -from plane.license.models import InstanceConfiguration, Instance from plane.license.utils.instance_value import get_email_configuration row_mapping = { @@ -52,11 +51,6 @@ def send_export_email(email, slug, csv_buffer, rows): csv_buffer.seek(0) - # Configure email connection from the database - instance_configuration = InstanceConfiguration.objects.filter( - key__startswith="EMAIL_" - ).values("key", "value") - ( EMAIL_HOST, EMAIL_HOST_USER, @@ -64,7 +58,7 @@ def send_export_email(email, slug, csv_buffer, rows): EMAIL_PORT, EMAIL_USE_TLS, EMAIL_FROM, - ) = get_email_configuration(instance_configuration=instance_configuration) + ) = get_email_configuration() connection = get_connection( host=EMAIL_HOST, diff --git a/apiserver/plane/bgtasks/forgot_password_task.py b/apiserver/plane/bgtasks/forgot_password_task.py index b24d81d93..563cc8a40 100644 --- a/apiserver/plane/bgtasks/forgot_password_task.py +++ b/apiserver/plane/bgtasks/forgot_password_task.py @@ -14,7 +14,6 @@ from celery import shared_task from sentry_sdk import capture_exception # Module imports -from plane.license.models import InstanceConfiguration, Instance from plane.license.utils.instance_value import get_email_configuration @@ -26,10 +25,6 @@ def forgot_password(first_name, email, uidb64, token, current_site): ) abs_url = str(current_site) + relative_link - instance_configuration = InstanceConfiguration.objects.filter( - key__startswith="EMAIL_" - ).values("key", "value") - ( EMAIL_HOST, EMAIL_HOST_USER, @@ -37,7 +32,7 @@ def forgot_password(first_name, email, uidb64, token, current_site): EMAIL_PORT, EMAIL_USE_TLS, EMAIL_FROM, - ) = get_email_configuration(instance_configuration=instance_configuration) + ) = get_email_configuration() subject = "A new password to your Plane account has been requested" @@ -51,9 +46,6 @@ def forgot_password(first_name, email, uidb64, token, current_site): text_content = strip_tags(html_content) - instance_configuration = InstanceConfiguration.objects.filter( - key__startswith="EMAIL_" - ).values("key", "value") connection = get_connection( host=EMAIL_HOST, port=int(EMAIL_PORT), diff --git a/apiserver/plane/bgtasks/magic_link_code_task.py b/apiserver/plane/bgtasks/magic_link_code_task.py index 2e8a7de16..55bbfa0d6 100644 --- a/apiserver/plane/bgtasks/magic_link_code_task.py +++ b/apiserver/plane/bgtasks/magic_link_code_task.py @@ -14,17 +14,12 @@ from celery import shared_task from sentry_sdk import capture_exception # Module imports -from plane.license.models import InstanceConfiguration, Instance from plane.license.utils.instance_value import get_email_configuration @shared_task def magic_link(email, key, token, current_site): try: - instance_configuration = InstanceConfiguration.objects.filter( - key__startswith="EMAIL_" - ).values("key", "value") - ( EMAIL_HOST, EMAIL_HOST_USER, @@ -32,7 +27,7 @@ def magic_link(email, key, token, current_site): EMAIL_PORT, EMAIL_USE_TLS, EMAIL_FROM, - ) = get_email_configuration(instance_configuration=instance_configuration) + ) = get_email_configuration() # Send the mail subject = f"Your unique Plane login code is {token}" diff --git a/apiserver/plane/bgtasks/project_invitation_task.py b/apiserver/plane/bgtasks/project_invitation_task.py index 1ff160afc..4ec06e623 100644 --- a/apiserver/plane/bgtasks/project_invitation_task.py +++ b/apiserver/plane/bgtasks/project_invitation_task.py @@ -13,7 +13,6 @@ from sentry_sdk import capture_exception # Module imports from plane.db.models import Project, User, ProjectMemberInvite -from plane.license.models import InstanceConfiguration from plane.license.utils.instance_value import get_email_configuration @shared_task @@ -47,7 +46,6 @@ def project_invitation(email, project_id, token, current_site, invitor): project_member_invite.save() # Configure email connection from the database - instance_configuration = InstanceConfiguration.objects.filter(key__startswith='EMAIL_').values("key", "value") ( EMAIL_HOST, EMAIL_HOST_USER, @@ -55,7 +53,7 @@ def project_invitation(email, project_id, token, current_site, invitor): EMAIL_PORT, EMAIL_USE_TLS, EMAIL_FROM, - ) = get_email_configuration(instance_configuration=instance_configuration) + ) = get_email_configuration() connection = get_connection( host=EMAIL_HOST, diff --git a/apiserver/plane/bgtasks/workspace_invitation_task.py b/apiserver/plane/bgtasks/workspace_invitation_task.py index 08fbaea62..1bdc48ca3 100644 --- a/apiserver/plane/bgtasks/workspace_invitation_task.py +++ b/apiserver/plane/bgtasks/workspace_invitation_task.py @@ -17,7 +17,6 @@ from slack_sdk.errors import SlackApiError # Module imports from plane.db.models import Workspace, WorkspaceMemberInvite, User -from plane.license.models import InstanceConfiguration, Instance from plane.license.utils.instance_value import get_email_configuration @@ -37,9 +36,6 @@ def workspace_invitation(email, workspace_id, token, current_site, invitor): # The complete url including the domain abs_url = str(current_site) + relative_link - instance_configuration = InstanceConfiguration.objects.filter( - key__startswith="EMAIL_" - ).values("key", "value") ( EMAIL_HOST, @@ -48,7 +44,7 @@ def workspace_invitation(email, workspace_id, token, current_site, invitor): EMAIL_PORT, EMAIL_USE_TLS, EMAIL_FROM, - ) = get_email_configuration(instance_configuration=instance_configuration) + ) = get_email_configuration() # Subject of the email subject = f"{user.first_name or user.display_name or user.email} has invited you to join them in {workspace.name} on Plane" @@ -69,9 +65,6 @@ def workspace_invitation(email, workspace_id, token, current_site, invitor): workspace_member_invite.message = text_content workspace_member_invite.save() - instance_configuration = InstanceConfiguration.objects.filter( - key__startswith="EMAIL_" - ).values("key", "value") connection = get_connection( host=EMAIL_HOST, port=int(EMAIL_PORT), diff --git a/apiserver/plane/license/utils/instance_value.py b/apiserver/plane/license/utils/instance_value.py index 547467f52..53481108a 100644 --- a/apiserver/plane/license/utils/instance_value.py +++ b/apiserver/plane/license/utils/instance_value.py @@ -1,63 +1,104 @@ +# Python imports import os +# Django imports +from django.conf import settings + +# Module imports +from plane.license.models import InstanceConfiguration +from plane.license.utils.encryption import decrypt_data + + + +def create_lookup_dict(list_of_dicts): + return {item['key']: item for item in list_of_dicts} + + # Helper function to return value from the passed key -def get_configuration_value(query, key, default=None): - for item in query: - if item["key"] == key: - return item.get("value", default) - return default +def get_configuration_value(keys): + environment_list = [] + if settings.SKIP_ENV_VAR: + # Get the configurations + instance_configuration = InstanceConfiguration.objects.values( + "key", "value", "is_encrypted" + ) + + for key in keys: + for item in instance_configuration: + if key.get("key") == item.get("key"): + if item.get("is_encrypted", False): + environment_list.append(decrypt_data(item.get("value"))) + else: + environment_list.append(item.get("value")) + + break + else: + environment_list.append(key.get("default")) + + return tuple(environment_list) -def get_email_configuration(instance_configuration): - # Get the configuration variables - EMAIL_HOST_USER = get_configuration_value( - instance_configuration, - "EMAIL_HOST_USER", - os.environ.get("EMAIL_HOST_USER", None), - ) +def get_email_configuration(): + if settings.SKIP_ENV_VAR: + ( + EMAIL_HOST_USER, + EMAIL_HOST_PASSWORD, + EMAIL_HOST, + EMAIL_FROM, + EMAIL_USE_TLS, + EMAIL_PORT, + ) = get_configuration_value( + [ + { + "key": "EMAIL_HOST_USER", + "default": os.environ.get("EMAIL_HOST_USER", None), + }, + { + "key": "EMAIL_HOST_PASSWORD", + "default": os.environ.get("EMAIL_HOST_PASSWORD", None), + }, + { + "key": "EMAIL_HOST", + "default": os.environ.get("EMAIL_HOST", None), + }, + { + "key": "EMAIL_FROM", + "default": os.environ.get("EMAIL_FROM", None), + }, + { + "key": "EMAIL_USE_TLS", + "default": os.environ.get("EMAIL_USE_TLS", "1"), + }, + { + "key": "EMAIL_PORT", + "default": os.environ.get("EMAIL_PORT", 587), + }, + ] + ) + return ( + EMAIL_HOST, + EMAIL_HOST_USER, + EMAIL_HOST_PASSWORD, + EMAIL_PORT, + EMAIL_USE_TLS, + EMAIL_FROM, + ) - EMAIL_HOST_PASSWORD = get_configuration_value( - instance_configuration, - "EMAIL_HOST_PASSWORD", - os.environ.get("EMAIL_HOST_PASSWORD", None), - ) + else: + # Get email configuration directly from os + EMAIL_HOST = os.environ.get("EMAIL_HOST") + EMAIL_HOST_USER = os.environ.get("EMAIL_HOST_USER") + EMAIL_HOST_PASSWORD = os.environ.get("EMAIL_HOST_PASSWORD") + EMAIL_PORT = os.environ.get("EMAIL_PORT", 587) + EMAIL_USE_TLS = os.environ.get("EMAIL_USE_TLS", "1") + EMAIL_FROM = os.environ.get("EMAIL_FROM", "Team Plane ") - EMAIL_HOST = get_configuration_value( - instance_configuration, - "EMAIL_HOST", - os.environ.get("EMAIL_HOST", None), - ) - - EMAIL_FROM = get_configuration_value( - instance_configuration, - "EMAIL_FROM", - os.environ.get("EMAIL_FROM", None), - ) - - EMAIL_USE_TLS = get_configuration_value( - instance_configuration, - "EMAIL_USE_TLS", - os.environ.get("EMAIL_USE_TLS", "1"), - ) - - EMAIL_PORT = get_configuration_value( - instance_configuration, - "EMAIL_PORT", - 587, - ) - - EMAIL_FROM = get_configuration_value( - instance_configuration, - "EMAIL_FROM", - os.environ.get("EMAIL_FROM", "Team Plane "), - ) - - return ( - EMAIL_HOST, - EMAIL_HOST_USER, - EMAIL_HOST_PASSWORD, - EMAIL_PORT, - EMAIL_USE_TLS, - EMAIL_FROM, - ) + return ( + EMAIL_HOST, + EMAIL_HOST_USER, + EMAIL_HOST_PASSWORD, + EMAIL_PORT, + EMAIL_USE_TLS, + EMAIL_FROM, + ) diff --git a/apiserver/plane/settings/common.py b/apiserver/plane/settings/common.py index 046a61aaf..76528176b 100644 --- a/apiserver/plane/settings/common.py +++ b/apiserver/plane/settings/common.py @@ -331,3 +331,6 @@ POSTHOG_HOST = os.environ.get("POSTHOG_HOST", False) INSTANCE_KEY = os.environ.get( "INSTANCE_KEY", "ae6517d563dfc13d8270bd45cf17b08f70b37d989128a9dab46ff687603333c3" ) + +# Skip environment variable configuration +SKIP_ENV_VAR = os.environ.get("SKIP_ENV_VAR", "1") == "1"