Source code for djangocms_installer.install

# -*- coding: utf-8 -*-
from __future__ import absolute_import, print_function, unicode_literals

import logging
import os.path
import shutil
import subprocess
import sys

from djangocms_installer.utils import query_yes_no

logger = logging.getLogger('')


[docs]def check_install(config_data): """ Here we do some **really** basic environment sanity checks. Basically we test for the more delicate and failing-prone dependencies: * database driver * Pillow image format support Many other errors will go undetected """ errors = [] # PIL tests try: from PIL import Image try: im = Image.open(os.path.join(os.path.dirname(__file__), '../share/test_image.png')) im.load() except IOError: # pragma: no cover errors.append( 'Pillow is not compiled with PNG support, see "Libraries installation issues" ' 'documentation section: https://djangocms-installer.readthedocs.io/en/latest/' 'libraries.html.' ) try: im = Image.open(os.path.join(os.path.dirname(__file__), '../share/test_image.jpg')) im.load() except IOError: # pragma: no cover errors.append( 'Pillow is not compiled with JPEG support, see "Libraries installation issues" ' 'documentation section: https://djangocms-installer.readthedocs.io/en/latest/' 'libraries.html' ) except ImportError: # pragma: no cover errors.append( 'Pillow is not installed check for installation errors and see "Libraries installation' ' issues" documentation section: https://djangocms-installer.readthedocs.io/en/latest/' 'libraries.html' ) # PostgreSQL test if config_data.db_driver == 'psycopg2' and not config_data.no_db_driver: # pragma: no cover try: import psycopg2 # NOQA except ImportError: errors.append( 'PostgreSQL driver is not installed, but you configured a PostgreSQL database, ' 'please check your installation and see "Libraries installation issues" ' 'documentation section: https://djangocms-installer.readthedocs.io/en/latest/' 'libraries.html' ) # MySQL test if config_data.db_driver == 'mysqlclient' and not config_data.no_db_driver: # pragma: no cover # NOQA try: import MySQLdb # NOQA except ImportError: errors.append( 'MySQL driver is not installed, but you configured a MySQL database, please check ' 'your installation and see "Libraries installation issues" documentation section: ' 'https://djangocms-installer.readthedocs.io/en/latest/libraries.html' ) if errors: # pragma: no cover raise EnvironmentError('\n'.join(errors))
[docs]def requirements(req_file, pip_options='', is_file=False, verbose=False): args = ['install', '--disable-pip-version-check'] if not verbose: args.append('-q') if pip_options: args.extend([opt for opt in pip_options.split(' ') if opt]) if is_file: # pragma: no cover args += ['-r', req_file] else: args.extend(['{0}'.format(package) for package in req_file.split()]) cmd = [sys.executable, '-mpip'] + args if verbose: sys.stdout.write('python path: {0}\n'.format(sys.executable)) sys.stdout.write('packages install command: {0}\n'.format(' '.join(cmd))) try: subprocess.check_output(['python', '-msite'], stderr=subprocess.STDOUT) output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) sys.stdout.write(output.decode('utf-8')) except Exception as e: logger.error('cmd : %s :%s' % (e.cmd, e.output)) raise return True
[docs]def write_requirements(config_data): with open(os.path.join(config_data.project_directory, 'requirements.txt'), 'w') as reqfile: reqfile.write(config_data.requirements)
[docs]def cleanup(requirements): # pragma: no cover import pip args = ['uninstall', '-q', '-y'] args.extend(requirements.split()) pip.main(args) return True
[docs]def cleanup_directory(config_data): """ Asks user for removal of project directory and eventually removes it """ if os.path.exists(config_data.project_directory): choice = False if config_data.noinput is False and not config_data.verbose: choice = query_yes_no( 'The installation failed.\n' 'Do you want to clean up by removing {0}?\n' '\tWarning: this will delete all files in:\n' '\t\t{0}\n' 'Do you want to cleanup?'.format( os.path.abspath(config_data.project_directory) ), 'no' ) else: sys.stdout.write('The installation has failed.\n') if config_data.skip_project_dir_check is False and (choice or (config_data.noinput and config_data.delete_project_dir)): sys.stdout.write('Removing everything under {0}\n'.format( os.path.abspath(config_data.project_directory) )) shutil.rmtree(config_data.project_directory, True)