73 lines
2.4 KiB
Python
73 lines
2.4 KiB
Python
import os
|
|
import sys
|
|
|
|
from fabric import task
|
|
from invoke import Context, Exit
|
|
|
|
APP_DIR = '/var/www/epcstages'
|
|
VIRTUALENV_DIR = '/var/virtualenvs/stages/bin/activate'
|
|
|
|
"""Read settings from Django settings"""
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
from common import settings
|
|
|
|
MAIN_HOST = settings.FABRIC_HOST
|
|
|
|
@task(hosts=[MAIN_HOST])
|
|
def clone_remote_db(conn):
|
|
"""
|
|
Copy remote data (JSON dump), download it locally and recreate a local
|
|
SQLite database with those data.
|
|
"""
|
|
local = Context()
|
|
db_name = settings.DATABASES['default']['NAME']
|
|
is_sqlite = 'sqlite' in settings.DATABASES['default']['ENGINE']
|
|
|
|
def exist_local_db():
|
|
if is_sqlite:
|
|
return os.path.exists(db_name)
|
|
else: # Assume postgres
|
|
db_list = local.run('psql --list', capture=True)
|
|
return (' ' + db_name + ' ') in db_list
|
|
|
|
if exist_local_db():
|
|
rep = input('A local database named "%s" already exists. Overwrite? (y/n)' % db_name)
|
|
if rep == 'y':
|
|
if is_sqlite:
|
|
os.remove(settings.DATABASES['default']['NAME'])
|
|
else:
|
|
local.run('''sudo -u postgres psql -c "DROP DATABASE %(db)s;"''' % {'db': db_name})
|
|
else:
|
|
raise Exit("Database not copied")
|
|
|
|
# Dump remote data and download the file
|
|
with conn.cd(APP_DIR):
|
|
with conn.prefix('source %s' % VIRTUALENV_DIR):
|
|
conn.run('python manage.py dumpdata --natural-foreign --indent 1 -e auth.Permission auth stages candidats > epcstages.json')
|
|
conn.get('epcstages.json', '.')
|
|
|
|
if not is_sqlite:
|
|
local.run(
|
|
'''sudo -u postgres psql -c "CREATE DATABASE %(db)s OWNER=%(owner)s;"''' % {
|
|
'db': db_name, 'owner': settings.DATABASES['default']['USER']
|
|
}
|
|
)
|
|
|
|
# Recreate a fresh DB with downloaded data
|
|
local.run("python ../manage.py migrate")
|
|
local.run("python ../manage.py flush --noinput")
|
|
local.run("python ../manage.py loaddata epcstages.json")
|
|
|
|
|
|
@task(hosts=[MAIN_HOST])
|
|
def deploy(conn):
|
|
"""
|
|
Deploy project with latest Github code
|
|
"""
|
|
with conn.cd(APP_DIR):
|
|
conn.run("git pull")
|
|
with conn.prefix('source %s' % VIRTUALENV_DIR):
|
|
conn.run("python manage.py migrate")
|
|
conn.run("python manage.py collectstatic --noinput")
|
|
conn.run("touch common/wsgi.py")
|
|
|