diff --git a/backend/apimanager/publish_methods.py b/backend/apimanager/publish_methods.py index 25087c8..5c9f441 100644 --- a/backend/apimanager/publish_methods.py +++ b/backend/apimanager/publish_methods.py @@ -1,6 +1,9 @@ from django.conf import settings import os import shutil +import subprocess +import tkinter as tk +from tkinter import simpledialog deployment_methods = { "server_deploy": { @@ -11,20 +14,116 @@ deployment_methods = { } } -def server_deploy(): - data_location = f'{settings.BASE_DIR}/deploy/' - deploy_location = settings.DEPLOY_CONFIG["DEPLOY_LOCATION"] +def invokeDialogueBox(title, message, type): + root = tk.Tk() + root.withdraw() + + input_data = None + if type == 'text': + input_data = simpledialog.askstring(title, message) + if type == 'password': + input_data = simpledialog.askstring(title, message, show='*') + + root.destroy() + + return input_data +def copyData(data_location, deploy_location): if not os.path.exists(data_location): print("The source directory does not exist.") else: try: - shutil.rmtree(f'{deploy_location}/data') + if os.path.exists(f'{deploy_location}/data'): + shutil.rmtree(f'{deploy_location}/data') + else: + pass shutil.copytree(data_location, deploy_location, dirs_exist_ok=True) print(f"Data successfully deployed") except Exception as e: print(f"Error occurred: {e}") - - +def server_deploy(): + data_location = f'{settings.BASE_DIR}/deploy/' + deploy_location = settings.DEPLOY_CONFIG["DEPLOY_LOCATION"]+'/server' + copyData(data_location, deploy_location) + def github_deploy(): - server_deploy() - print("Deploying via github") \ No newline at end of file + print("Deploying via github") + git_commands = {} + git_commands["git_init"] = ['git', 'init'] + git_commands["git_add"] = ['git', 'add', '.'] + git_commands["git_commit"] = ['git', 'commit', '-m', '"Update website"'] + git_commands["git_branch"] = ['git', 'branch', '-m', 'main'] + git_commands["git_push"] = ['git', 'push', '-u', 'origin', 'main'] + + data_location = f'{settings.BASE_DIR}/deploy/' + deploy_location = settings.DEPLOY_CONFIG["DEPLOY_LOCATION"]+'/ghpages' + + run_gh_build = ['npm', 'run', 'build:ghpages'] + + subprocess.run(run_gh_build, cwd=settings.DEPLOY_CONFIG["DEPLOY_LOCATION"].replace('/dist', ''), check=True, text=True, capture_output=True) + create_404_page(deploy_location) + copyData(data_location, deploy_location) + + if not os.path.exists(f'{deploy_location}/.git'): + github_init(deploy_location, git_commands) + gh_pages_deploy(deploy_location, git_commands) + else: + gh_pages_deploy(deploy_location, git_commands) + +def github_init(deploy_location, git_commands): + username = invokeDialogueBox('Github Deploy', 'Enter your username', 'text') + password = invokeDialogueBox('Github Deploy', 'Enter your password', 'password') + remote_url = f'https://{username}:{password}@github.com/{username}/{username}.github.io.git' + git_add_url = ['git', 'remote', 'add', 'origin', remote_url] + + try: + subprocess.run(git_commands["git_init"], cwd=deploy_location, check=True, text=True, capture_output=True) + subprocess.run(git_commands["git_add"], cwd=deploy_location, check=True, text=True, capture_output=True) + subprocess.run(git_commands["git_commit"], cwd=deploy_location, check=True, text=True, capture_output=True) + subprocess.run(git_commands["git_branch"], cwd=deploy_location, check=True, text=True, capture_output=True) + subprocess.run(git_add_url, cwd=deploy_location, check=True, text=True, capture_output=True) + subprocess.run(git_commands["git_push"], cwd=deploy_location, check=True, text=True, capture_output=True) + except subprocess.CalledProcessError as e: + print (f"Failed to add remote: {e.stderr}") + except Exception as e: + print (f"An error occurred: {str(e)}") + + +def gh_pages_deploy(deploy_location, git_commands): + try: + subprocess.run(git_commands["git_add"], cwd=deploy_location, check=True, text=True, capture_output=True) + subprocess.run(git_commands["git_commit"], cwd=deploy_location, check=True, text=True, capture_output=True) + subprocess.run(git_commands["git_push"], cwd=deploy_location, check=True, text=True, capture_output=True) + except subprocess.CalledProcessError as e: + return f"Failed to add remote: {e.stderr}" + except Exception as e: + return f"An error occurred: {str(e)}" + + +def create_404_page(deploy_location): + html_content = """ + + + + + Single Page Apps for GitHub Pages + + + + + + """ + + with open(f'{deploy_location}/404.html', 'w') as file: + file.write(html_content) + + print("404 page created successfully.") \ No newline at end of file diff --git a/backend/backend/settings.py b/backend/backend/settings.py index 137eae1..2faa78d 100644 --- a/backend/backend/settings.py +++ b/backend/backend/settings.py @@ -42,7 +42,7 @@ INSTALLED_APPS = [ ] DEPLOY_CONFIG = { - "DEPLOY_LOCATION": os.path.join(BASE_DIR, '../frontend-deploy/') + "DEPLOY_LOCATION": os.path.join(BASE_DIR, '../frontend/viewable-ui/dist') } REST_FRAMEWORK = { diff --git a/frontend/viewable-ui/package-lock.json b/frontend/viewable-ui/package-lock.json index 0506297..d070712 100644 --- a/frontend/viewable-ui/package-lock.json +++ b/frontend/viewable-ui/package-lock.json @@ -40,6 +40,7 @@ "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@vitejs/plugin-react": "^4.2.1", + "cross-env": "^7.0.3", "eslint": "^8.57.0", "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", @@ -2318,6 +2319,24 @@ "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "peer": true }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", diff --git a/frontend/viewable-ui/package.json b/frontend/viewable-ui/package.json index f775fa3..f84541b 100644 --- a/frontend/viewable-ui/package.json +++ b/frontend/viewable-ui/package.json @@ -3,14 +3,13 @@ "private": true, "version": "0.0.0", "type": "module", - "proxy": "http://127.0.0.1:8000", - "homepage": "/", "scripts": { "dev": "vite --host 0.0.0.0 --port 3000", - "build": "vite build", + "build:server": "cross-env BUILD_ENV=server vite build", + "build:ghpages": "cross-env BUILD_ENV=ghpages cross-env vite build", "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", - "deploy": "gh-pages -d dist" + "ghdeploy": "gh-pages -d dist/ghpages -r" }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.5.2", @@ -45,6 +44,7 @@ "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@vitejs/plugin-react": "^4.2.1", + "cross-env": "^7.0.3", "eslint": "^8.57.0", "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", diff --git a/frontend/viewable-ui/src/components/blog.jsx b/frontend/viewable-ui/src/components/blog.jsx index 6703484..441788b 100755 --- a/frontend/viewable-ui/src/components/blog.jsx +++ b/frontend/viewable-ui/src/components/blog.jsx @@ -61,7 +61,7 @@ function Blog(props) { if (GlobalTheme && ThemeConfig) { return ( - + diff --git a/frontend/viewable-ui/src/components/home.jsx b/frontend/viewable-ui/src/components/home.jsx index eab2396..5162cfa 100755 --- a/frontend/viewable-ui/src/components/home.jsx +++ b/frontend/viewable-ui/src/components/home.jsx @@ -44,7 +44,7 @@ function HomePage(props) { - +
{introContent}
diff --git a/frontend/viewable-ui/vite.config.js b/frontend/viewable-ui/vite.config.js index 83f9b80..358f0b7 100644 --- a/frontend/viewable-ui/vite.config.js +++ b/frontend/viewable-ui/vite.config.js @@ -1,10 +1,23 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +console.log(process.env.BUILD_ENV) // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], - server: { - historyApiFallback: true - }, + plugins: [ + react(), + process.env.BUILD_ENV === 'ghpages' ? { + name: 'inject-ghpages-fix', + transformIndexHtml(html) { + return html.replace( + '
', + "
" + ); + } + } : '' + ], + server: {}, + build: { + outDir: 'dist/' + process.env.BUILD_ENV + } }) \ No newline at end of file