Browse Source

On init create django project and migrate the DB

rafalp 6 years ago
parent
commit
a2b9d472a8
2 changed files with 116 additions and 17 deletions
  1. 55 17
      dev
  2. 61 0
      misago/bin/misago-start-devproject.py

+ 55 - 17
dev

@@ -17,27 +17,47 @@ dev_paths=(
     "./devproject"
     "./devproject"
     "./media"
     "./media"
     "./static"
     "./static"
+    "./theme"
     "./userdata"
     "./userdata"
+    "./cron.txt"
     "./manage.py"
     "./manage.py"
 )
 )
 
 
-print_dev_paths() {
-    for x in "${dev_paths[@]}"; do
-        echo "next element is '$x'"
-    done
-}
+# Required ports
+# Some tasks test for those ports before continuing
+port_django=8000
+port_postgresql=5432
+
+required_ports=($port_postgresql)
 
 
 # Some commond shorthands
 # Some commond shorthands
 docker_stop() {
 docker_stop() {
     docker-compose stop
     docker-compose stop
 }
 }
 
 
-# Test required ports
-# We test if those ports are free before running docker
-port_django=8000
-port_postgresql=5432
+docker_rebuild() {
+    docker_stop
+    docker-compose build --no-cache
+}
 
 
-required_ports=($port_postgresql)
+docker_down() {
+    docker_stop
+    docker-compose down --remove-orphans
+}
+
+error() {
+    echo -e "${RED}Error:${NORMAL} $1"
+}
+
+wait_for_db() {
+    export PGPASSWORD=$POSTGRES_PASSWORD
+    RETRIES=10
+
+    until psql -h $POSTGRES_HOST -U $POSTGRES_USER -d $POSTGRES_DB -c "select 1" > /dev/null 2>&1 || [ $RETRIES -eq 0 ]; do
+        echo "Waiting for postgres server, $((RETRIES--)) remaining attempts..."
+        sleep 5
+    done
+}
 
 
 # Commands
 # Commands
 intro() {
 intro() {
@@ -64,7 +84,7 @@ invalid_option() {
 init() {
 init() {
     for dev_path in "${dev_paths[@]}"; do
     for dev_path in "${dev_paths[@]}"; do
         if [ -e $dev_path ]; then
         if [ -e $dev_path ]; then
-            echo -e "${RED}Error:${NORMAL} Dev project already exists, or was not deleted completely."
+            error "Dev project already exists, or was not deleted completely."
             echo
             echo
             echo "Please use \"clear\" option to clear any pissible remaining files and try again."
             echo "Please use \"clear\" option to clear any pissible remaining files and try again."
             exit 1
             exit 1
@@ -74,16 +94,33 @@ init() {
     for port in "${required_ports[@]}"; do
     for port in "${required_ports[@]}"; do
         nc "127.0.0.1" "$port" < /dev/null
         nc "127.0.0.1" "$port" < /dev/null
         if [[ $? = "0" ]]; then
         if [[ $? = "0" ]]; then
-            echo -e "${RED}Error:${NORMAL} Port ${BOLD}$port${NORMAL} is not available."
-            echo
             if [[ $port = $port_django ]]; then
             if [[ $port = $port_django ]]; then
-                echo "Django application appears to already be running on http://127.0.0.1:8000"
+                error "Django application appears to already be running on http://127.0.0.1:8000"
             elif [[ $port = $port_postgresql ]]; then
             elif [[ $port = $port_postgresql ]]; then
-                echo "PostgreSQL appears to already be running on port $port."
+                error "PostgreSQL appears to already be running on port $port."
             fi
             fi
             exit 1
             exit 1
         fi
         fi
     done
     done
+    
+    docker_rebuild
+    docker-compose run --rm misago ./dev init_in_docker
+}
+
+init_in_docker() {
+    wait_for_db
+    # initialize django project
+    python misago/bin/misago-start-devproject.py
+    # move items of interest up one level
+    mv devproject/devproject devproject_tmp
+    mv devproject/avatargallery ./avatargallery
+    mv devproject/media ./media
+    mv devproject/userdata ./userdata
+    mv devproject/manage.py ./manage.py
+    rm -rf devproject
+    mv devproject_tmp devproject
+    # migrate the DB
+    python manage.py migrate
 }
 }
 
 
 # Clear existing dev project
 # Clear existing dev project
@@ -131,8 +168,7 @@ clear() {
 
 
 # Rebuild docker containers
 # Rebuild docker containers
 rebuild() {
 rebuild() {
-    docker_stop
-    docker-compose build --no-cache
+    docker_rebuild
     exit 0
     exit 0
 }
 }
 
 
@@ -147,6 +183,8 @@ test() {
 if [[ $1 ]]; then
 if [[ $1 ]]; then
     if [[ $1 = "init" ]]; then
     if [[ $1 = "init" ]]; then
         init
         init
+    elif [[ $1 = "init_in_docker" ]]; then
+        init_in_docker
     elif [[ $1 = "clear" ]]; then
     elif [[ $1 = "clear" ]]; then
         clear
         clear
     elif [[ $1 = "rebuild" ]]; then
     elif [[ $1 = "rebuild" ]]; then

+ 61 - 0
misago/bin/misago-start-devproject.py

@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+"""
+Creates a dev project for local development
+"""
+
+import os
+import sys
+
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+
+
+def main():
+    project_name = os.environ['PROJECT_NAME']
+
+    # Allow for overriding project name
+    if len(sys.argv) > 1:
+        project_name = sys.argv[1]
+    else:
+        sys.argv.append(project_name)
+
+    settings_file = os.path.join(BASE_DIR, project_name, project_name, 'settings.py')
+
+    # Avoid recreating if already present
+    if os.path.exists(settings_file):
+        return
+
+    from misago.core import setup
+
+    setup.start_misago_project()
+    fill_in_settings(settings_file)
+
+
+def fill_in_settings(f):
+    with open(f, 'r') as fd:
+        s = fd.read()
+
+        # Postgres
+        s = s.replace("'NAME': '',", "'NAME': os.environ.get('POSTGRES_DB'),")
+        s = s.replace("'USER': '',", "'USER': os.environ.get('POSTGRES_USER'),")
+        s = s.replace("'PASSWORD': '',", "'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),")
+        s = s.replace("'HOST': 'localhost',", "'HOST': os.environ.get('POSTGRES_HOST'),")
+
+        # Specify console backend for email
+        s += "\nEMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'\n"
+
+        # Empty the contents of STATICFILES_DIRS (STATICFILES_DIRS = [])
+        pos = s.find('STATICFILES_DIRS')
+        s = s[:s.find('[', pos) + 1] + s[s.find(']', pos):]
+
+        # Remote theme dir from template dirs
+        pos = s.find("'DIRS': [")
+        s = s[:s.find('[', pos) + 1] + s[s.find(']', pos):]
+
+    with open(f, 'w') as fd:
+        fd.write(s)
+
+
+if __name__ == '__main__':
+    sys.path.append(BASE_DIR)
+    main()