Просмотр исходного кода

On init create django project and migrate the DB

rafalp 6 лет назад
Родитель
Сommit
a2b9d472a8
2 измененных файлов с 116 добавлено и 17 удалено
  1. 55 17
      dev
  2. 61 0
      misago/bin/misago-start-devproject.py

+ 55 - 17
dev

@@ -17,27 +17,47 @@ dev_paths=(
     "./devproject"
     "./media"
     "./static"
+    "./theme"
     "./userdata"
+    "./cron.txt"
     "./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
 docker_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
 intro() {
@@ -64,7 +84,7 @@ invalid_option() {
 init() {
     for dev_path in "${dev_paths[@]}"; do
         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 "Please use \"clear\" option to clear any pissible remaining files and try again."
             exit 1
@@ -74,16 +94,33 @@ init() {
     for port in "${required_ports[@]}"; do
         nc "127.0.0.1" "$port" < /dev/null
         if [[ $? = "0" ]]; then
-            echo -e "${RED}Error:${NORMAL} Port ${BOLD}$port${NORMAL} is not available."
-            echo
             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
-                echo "PostgreSQL appears to already be running on port $port."
+                error "PostgreSQL appears to already be running on port $port."
             fi
             exit 1
         fi
     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
@@ -131,8 +168,7 @@ clear() {
 
 # Rebuild docker containers
 rebuild() {
-    docker_stop
-    docker-compose build --no-cache
+    docker_rebuild
     exit 0
 }
 
@@ -147,6 +183,8 @@ test() {
 if [[ $1 ]]; then
     if [[ $1 = "init" ]]; then
         init
+    elif [[ $1 = "init_in_docker" ]]; then
+        init_in_docker
     elif [[ $1 = "clear" ]]; then
         clear
     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()