From a324406fbdce337de5bdb12b862bc33421abc329 Mon Sep 17 00:00:00 2001 From: devilsautumn Date: Mon, 9 Sep 2024 16:57:24 +0530 Subject: [PATCH 1/3] created initialize-project command --- backend/src/zango/cli/__init__.py | 3 +- backend/src/zango/cli/initialize_project.py | 134 ++++++++++++++++++++ 2 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 backend/src/zango/cli/initialize_project.py diff --git a/backend/src/zango/cli/__init__.py b/backend/src/zango/cli/__init__.py index b2fafbd60..e7d2b693a 100644 --- a/backend/src/zango/cli/__init__.py +++ b/backend/src/zango/cli/__init__.py @@ -1,6 +1,6 @@ import click -from zango.cli import install_package, package_info, start_project +from zango.cli import initialize_project, install_package, package_info, start_project @click.group() @@ -12,6 +12,7 @@ def cli(): cli.add_command(start_project.start_project) cli.add_command(package_info.list_packages) cli.add_command(install_package.install_package) +cli.add_command(initialize_project.initialize_project) if __name__ == "__main__": cli() diff --git a/backend/src/zango/cli/initialize_project.py b/backend/src/zango/cli/initialize_project.py new file mode 100644 index 000000000..e83f1c7c5 --- /dev/null +++ b/backend/src/zango/cli/initialize_project.py @@ -0,0 +1,134 @@ +import os +import sys + +from pathlib import Path + +import click + +import django + +from django.core.management import call_command + +from .start_project import create_platform_user, create_public_tenant, test_db_conection + + +def create_environment_variables( + project_name, + db_name, + db_user, + db_password, + db_host, + db_port, + redis_host="127.0.0.1", + redis_port="6379", +): + env_keys = { + "POSTGRES_DB": db_name, + "POSTGRES_USER": db_user, + "POSTGRES_PASSWORD": db_password, + "POSTGRES_HOST": db_host, + "POSTGRES_PORT": db_port, + "REDIS_HOST": redis_host, + "REDIS_PORT": redis_port, + "PROJECT_NAME": project_name, + } + project_root = os.path.join(os.getcwd(), project_name) + env_path = os.path.join(Path(project_root).parent, ".env") + if not os.path.exists(env_path): + open(env_path, "w").close() + fcontent = open(env_path).read() + with open(env_path, "a+") as f: + for key, value in env_keys.items(): + if key not in fcontent: + f.write(f"{key}={value}\n") + + +@click.command(name="initialize-project") +@click.argument("project_name") +@click.option("--db_name", prompt=True, help="DB Name") +@click.option("--db_user", prompt=True, help="DB User") +@click.option("--db_password", prompt=True, hide_input=True, help="DB Password") +@click.option("--db_host", prompt=True, help="DB Host", default="127.0.0.1") +@click.option("--db_port", prompt=True, help="DB Port", default="5432") +@click.option("--redis_host", prompt=True, help="Redis Host", default="127.0.0.1") +@click.option("--redis_port", prompt=True, help="Redis Port", default="6379") +@click.option("--platform_username", prompt=False, help="Platform Username") +@click.option( + "--platform_domain_url", + prompt=False, + help="Platform Domain URL", + default="localhost", +) +@click.option( + "--platform_user_password", + prompt=False, + hide_input=True, + help="Platform User Password", +) +def initialize_project( + project_name, + db_name, + db_user, + db_password, + db_host, + db_port, + redis_host, + redis_port, + platform_username, + platform_user_password, + platform_domain_url, +): + db_connection_status = test_db_conection( + db_name, db_user, db_password, db_host, db_port + ) + click.echo(f"db_connection_status: {db_connection_status}") + if not db_connection_status: + raise click.ClickException("DB Connection Failed!") + + # Initializing the project + project_root = os.path.join(os.getcwd(), project_name) + create_environment_variables( + project_name, + db_name, + db_user, + db_password, + db_host, + db_port, + redis_host, + redis_port, + ) + sys.path.insert(0, project_root) + os.environ.setdefault("DJANGO_SETTINGS_MODULE", f"{project_name}.settings") + + django.setup() + + # Migrating Schemas + call_command("migrate_schemas", schema="public") + + # Creating Public Tenant + create_public_tenant(platform_domain_url=platform_domain_url) + + # Prompting default platform user details + while True: + if not platform_username: + click.echo("Please enter platform user email") + platform_username = click.prompt("Email") + if not platform_user_password: + platform_user_password = click.prompt( + "Password", hide_input=True, confirmation_prompt=True + ) + + user_creation_result = create_platform_user( + platform_username, platform_user_password + ) + if user_creation_result["success"]: + break + else: + platform_username = None + platform_user_password = None + click.echo(user_creation_result["message"]) + retry = click.prompt("Do you want to try again? (yes/no)", default="yes") + if retry.lower() != "yes": + raise click.ClickException("User creation aborted by the user.") + + click.echo(user_creation_result["message"]) From 6b8644694382183626b1ffe55a11aeca1bb240ba Mon Sep 17 00:00:00 2001 From: devilsautumn Date: Mon, 9 Sep 2024 16:59:22 +0530 Subject: [PATCH 2/3] minor --- backend/src/zango/cli/initialize_project.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/zango/cli/initialize_project.py b/backend/src/zango/cli/initialize_project.py index e83f1c7c5..076ea741e 100644 --- a/backend/src/zango/cli/initialize_project.py +++ b/backend/src/zango/cli/initialize_project.py @@ -12,7 +12,7 @@ from .start_project import create_platform_user, create_public_tenant, test_db_conection -def create_environment_variables( +def generate_env_file( project_name, db_name, db_user, @@ -87,7 +87,7 @@ def initialize_project( # Initializing the project project_root = os.path.join(os.getcwd(), project_name) - create_environment_variables( + generate_env_file( project_name, db_name, db_user, From 98454f9553e4f0cd985240170dad7cc89c8c70fb Mon Sep 17 00:00:00 2001 From: devilsautumn Date: Wed, 25 Sep 2024 18:36:05 +0530 Subject: [PATCH 3/3] added docstring --- backend/src/zango/cli/initialize_project.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/src/zango/cli/initialize_project.py b/backend/src/zango/cli/initialize_project.py index 076ea741e..58da56ca5 100644 --- a/backend/src/zango/cli/initialize_project.py +++ b/backend/src/zango/cli/initialize_project.py @@ -78,6 +78,9 @@ def initialize_project( platform_user_password, platform_domain_url, ): + """ + Used to initialize the zango project on an empty db. + """ db_connection_status = test_db_conection( db_name, db_user, db_password, db_host, db_port )